如何编码和解码 NSCalendarUnit

How to encode and decode NSCalendarUnit

如何编码和解码NSCalendarUnit像其他对象一样

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

试图像这样在 NSNumber 中保存 NSCalendarUnit @(self.repetition); 但我在登录时得到 64

我想对 NSCalendarUnit 进行编码并保存,稍后需要时对其进行解码并像这样使用它进行比较 if(xxxxx == NSCalendarUnit)

NSCalendarUnit是一个选项集(NS_OPTIONS),这意味着一个NSCalendarUnit值可以是none,一个或多个单位值。 您需要执行 bit mask if ((xxxx & NSCalendarUnitHour) != 0) 来检查值。

您可以像现在一样将值编码为 NSNumber 并在解码时使用 NSNumber.unsignedInteger 获取值(请注意 NSCalendarUnit 的枚举已定义作为 NSUInteger)。 (请注意,您还可以使用 -[NSCoder encodeInteger:forKey:] 将值存储为 NSInteger。)

序列化

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

反序列化

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

正在检查

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

NSCalendarUnit 是一个无符号长整型,所以它可以 "boxed"(变成一个对象)在 NSNumber 上使用两种方法用于无符号长整型:

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

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

而且您可能知道如何对 NSNumber 进行编码和解码,只需将额外的框步骤添加到 encode/decode 方法中...

- (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;
}