如何编码和解码 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;
}
如何编码和解码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;
}