[英]How to encode and decode NSCalendarUnit
如何像其他對象一樣對NSCalendarUnit
進行編碼和解碼
self.myStr = [decoder decodeObjectForKey:@"myStr"];
[encoder encodeObject:self.myStr forKey:@"myStr"];
試圖將NSCalendarUnit
像這樣@(self.repetition);
保存到NSNumber
@(self.repetition);
但是我登錄時得到64
。
我想對NSCalendarUnit
進行編碼並保存,稍后在需要時對其進行解碼,並使用它進行比較,例如if(xxxxx == NSCalendarUnit)
NSCalendarUnit
是一個選項集( NS_OPTIONS
),這意味着NSCalendarUnit
值可以是單位的一個,一個或多個值。 if ((xxxx & NSCalendarUnitHour) != 0)
, if ((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
}
NSCalendarUnit
是一個無符號的long,因此可以使用NSNumber
用於無符號的long的兩種方法對其進行“裝箱”(制成一個對象):
NSCalendarUnit someNSCalendarUnit = NSCalendarUnitDay;
NSNumber *boxed = [NSNumber numberWithUnsignedLong:someNSCalendarUnit];
和
NSCalendarUnit unboxed = [boxed unsignedLongLongValue];
// now, unboxed == someNSCalendarUnit
您可能知道如何對解碼的NSNumbers進行編碼,只需將額外的box-step添加到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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.