如何像其他对象一样编码和解码NSCalendarUnit,如
self.myStr = [decoder decodeObjectForKey:@"myStr"];
[encoder encodeObject:self.myStr forKey:@"myStr"];试图将NSCalendarUnit保存在NSNumber中,像这样的@(self.repetition);,但是当我登录时会得到64。
我想对NSCalendarUnit进行编码并保存,稍后必要时对其进行解码,并使用它进行比较,如下面的if(xxxxx == NSCalendarUnit)所示
发布于 2016-10-02 15:57:42
NSCalendarUnit是一个无符号长,因此可以使用NSNumber上的两个方法对未签名的long进行“装箱”(使其成为一个对象):
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;
}发布于 2016-10-02 13:27:12
NSCalendarUnit是一个选项集(NS_OPTIONS),这意味着NSCalendarUnit值可以是单元的任何值、一个值或多个值。您需要执行一个位掩码 if ((xxxx & NSCalendarUnitHour) != 0)来检查值。
您可以像现在一样将值编码为NSNumber,并在解码时使用NSNumber.unsignedInteger获取值(请注意,NSCalendarUnit的枚举被定义为NSUInteger)。(注意,还可以使用NSInteger将值存储为-[NSCoder encodeInteger:forKey:]。)
Serialisation
[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
}https://stackoverflow.com/questions/39817462
复制相似问题