2016-10-02 27 views
1

如何编码,并像其他对象进行解码NSCalendarUnit,像如何编码和解码NSCalendarUnit

self.myStr = [decoder decodeObjectForKey:@"myStr"]; 
[encoder encodeObject:self.myStr forKey:@"myStr"]; 

试过在NSNumber保存NSCalendarUnit这样@(self.repetition);但我正在逐渐64当我登录。

欲编码NSCalendarUnit并保存,以后需要解码它,当和使用它的像这样if(xxxxx == NSCalendarUnit)

回答

1

NSCalendarUnit是一个无符号长,所以使用上NSNumber两种方法用于无符号多头可以“盒装”(制作成一个对象):

NSCalendarUnit someNSCalendarUnit = NSCalendarUnitDay; 
NSNumber *boxed = [NSNumber numberWithUnsignedLong:someNSCalendarUnit]; 

NSCalendarUnit unboxed = [boxed unsignedLongLongValue]; 
// now, unboxed == someNSCalendarUnit 

而且你可能知道如何编码一个解码NSNumbers,只需在编码/解码方法中添加额外的盒步...

- (void)encodeWithCoder:(NSCoder*)encoder { 
    [super encodeWithCoder:encoder]; 

    NSNumber *boxed = [NSNumber numberWithUnsignedLong:self.someNSCalendarUnit]; 
    [encoder encodeObject:boxed forKey:@"someNSCalendarUnit"]; 
    // ... 

} 

- (id)initWithCoder:(NSCoder*)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     NSNumber *boxed = [aDecoder decodeObjectForKey:@"someNSCalendarUnit"]; 
     _someNSCalendarUnit = [boxed unsignedLongLongValue]; 
     // ... 
    } 
    return self; 
} 
1

NSCalendarUnit比较的选项集(NS_OPTIONS),这意味着一个NSCalendarUnit值可以是零个,一个或更多的单位价值。 您需要执行bit maskif ((xxxx & NSCalendarUnitHour) != 0)来检查值。

你没事喜欢你现在的编码值,为NSNumber和使用NSNumber.unsignedInteger得到解码时的值(注意,NSCalendarUnit枚举被定义为NSUInteger)。 (请注意,您还可以存储使用-[NSCoder encodeInteger:forKey:]值作为NSInteger。)

系列化

[encoder encodeObject:@(self.repetition) forKey:@"repetition"]; 

Deserialisation

self.repetition = [[decoder decodeObjectOfClass:[NSNumber class] 
        forKey:@"repetition"] unsignedInteger]; 

检查

if ((self.repetition & NSCalendarUnitHour) != 0) { 
    // Do something 
} else if ((self.repetition & NSCalendarUnitMinute) != 0) { 
    // Do something 
}