// // MOSignBaseData.m // // Created by SuperCabbage on 2024/5/31 // Copyright (c) 2024 __MyCompanyName__. All rights reserved. // #import "MOSignBaseData.h" #import "MOSignPrizes.h" #import "MOSignExtras.h" NSString *const kMOSignBaseDataSignPrizes = @"prizes"; NSString *const kMOSignBaseDataContinuous = @"continuous"; NSString *const kMOSignBaseDataDays = @"days"; NSString *const kMOSignBaseDataMonth = @"month"; NSString *const kMOSignBaseDataYear = @"year"; NSString *const kMOSignBaseDataSign = @"sign"; NSString *const kMOSignBaseDataSignExtras = @"extras"; @interface MOSignBaseData () - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict; @end @implementation MOSignBaseData @synthesize signPrizes = _signPrizes; @synthesize continuous = _continuous; @synthesize days = _days; @synthesize month = _month; @synthesize year = _year; @synthesize sign = _sign; @synthesize signExtras = _signExtras; + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict { return [[self alloc] initWithDictionary:dict]; } - (instancetype)initWithDictionary:(NSDictionary *)dict { self = [super init]; // This check serves to make sure that a non-NSDictionary object // passed into the model class doesn't break the parsing. if (self && [dict isKindOfClass:[NSDictionary class]]) { NSObject *receivedMOSignPrizes = [dict objectForKey:kMOSignBaseDataSignPrizes]; NSMutableArray *parsedMOSignPrizes = [NSMutableArray array]; if ([receivedMOSignPrizes isKindOfClass:[NSArray class]]) { for (NSDictionary *item in (NSArray *)receivedMOSignPrizes) { if ([item isKindOfClass:[NSDictionary class]]) { [parsedMOSignPrizes addObject:[MOSignPrizes modelObjectWithDictionary:item]]; } } } else if ([receivedMOSignPrizes isKindOfClass:[NSDictionary class]]) { [parsedMOSignPrizes addObject:[MOSignPrizes modelObjectWithDictionary:(NSDictionary *)receivedMOSignPrizes]]; } self.signPrizes = [NSArray arrayWithArray:parsedMOSignPrizes]; self.continuous = [[self objectOrNilForKey:kMOSignBaseDataContinuous fromDictionary:dict] doubleValue]; self.days = [self objectOrNilForKey:kMOSignBaseDataDays fromDictionary:dict]; self.month = [[self objectOrNilForKey:kMOSignBaseDataMonth fromDictionary:dict] doubleValue]; self.year = [[self objectOrNilForKey:kMOSignBaseDataYear fromDictionary:dict] doubleValue]; self.sign = [[self objectOrNilForKey:kMOSignBaseDataSign fromDictionary:dict] boolValue]; NSObject *receivedMOSignExtras = [dict objectForKey:kMOSignBaseDataSignExtras]; NSMutableArray *parsedMOSignExtras = [NSMutableArray array]; if ([receivedMOSignExtras isKindOfClass:[NSArray class]]) { for (NSDictionary *item in (NSArray *)receivedMOSignExtras) { if ([item isKindOfClass:[NSDictionary class]]) { [parsedMOSignExtras addObject:[MOSignExtras modelObjectWithDictionary:item]]; } } } else if ([receivedMOSignExtras isKindOfClass:[NSDictionary class]]) { [parsedMOSignExtras addObject:[MOSignExtras modelObjectWithDictionary:(NSDictionary *)receivedMOSignExtras]]; } self.signExtras = [NSArray arrayWithArray:parsedMOSignExtras]; } return self; } - (NSDictionary *)dictionaryRepresentation { NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; NSMutableArray *tempArrayForSignPrizes = [NSMutableArray array]; for (NSObject *subArrayObject in self.signPrizes) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForSignPrizes addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForSignPrizes addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForSignPrizes] forKey:kMOSignBaseDataSignPrizes]; [mutableDict setValue:[NSNumber numberWithDouble:self.continuous] forKey:kMOSignBaseDataContinuous]; NSMutableArray *tempArrayForDays = [NSMutableArray array]; for (NSObject *subArrayObject in self.days) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForDays addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForDays addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForDays] forKey:kMOSignBaseDataDays]; [mutableDict setValue:[NSNumber numberWithDouble:self.month] forKey:kMOSignBaseDataMonth]; [mutableDict setValue:[NSNumber numberWithDouble:self.year] forKey:kMOSignBaseDataYear]; [mutableDict setValue:[NSNumber numberWithBool:self.sign] forKey:kMOSignBaseDataSign]; NSMutableArray *tempArrayForSignExtras = [NSMutableArray array]; for (NSObject *subArrayObject in self.signExtras) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForSignExtras addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForSignExtras addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForSignExtras] forKey:kMOSignBaseDataSignExtras]; return [NSDictionary dictionaryWithDictionary:mutableDict]; } - (NSString *)description { return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]]; } #pragma mark - Helper Method - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict { id object = [dict objectForKey:aKey]; return [object isEqual:[NSNull null]] ? nil : object; } #pragma mark - NSCoding Methods - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; self.signPrizes = [aDecoder decodeObjectForKey:kMOSignBaseDataSignPrizes]; self.continuous = [aDecoder decodeDoubleForKey:kMOSignBaseDataContinuous]; self.days = [aDecoder decodeObjectForKey:kMOSignBaseDataDays]; self.month = [aDecoder decodeDoubleForKey:kMOSignBaseDataMonth]; self.year = [aDecoder decodeDoubleForKey:kMOSignBaseDataYear]; self.sign = [aDecoder decodeBoolForKey:kMOSignBaseDataSign]; self.signExtras = [aDecoder decodeObjectForKey:kMOSignBaseDataSignExtras]; return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_signPrizes forKey:kMOSignBaseDataSignPrizes]; [aCoder encodeDouble:_continuous forKey:kMOSignBaseDataContinuous]; [aCoder encodeObject:_days forKey:kMOSignBaseDataDays]; [aCoder encodeDouble:_month forKey:kMOSignBaseDataMonth]; [aCoder encodeDouble:_year forKey:kMOSignBaseDataYear]; [aCoder encodeBool:_sign forKey:kMOSignBaseDataSign]; [aCoder encodeObject:_signExtras forKey:kMOSignBaseDataSignExtras]; } - (id)copyWithZone:(NSZone *)zone { MOSignBaseData *copy = [[MOSignBaseData alloc] init]; if (copy) { copy.signPrizes = [self.signPrizes copyWithZone:zone]; copy.continuous = self.continuous; copy.days = [self.days copyWithZone:zone]; copy.month = self.month; copy.year = self.year; copy.sign = self.sign; copy.signExtras = [self.signExtras copyWithZone:zone]; } return copy; } @end