簡體   English   中英

如何編碼和解碼NSCalendarUnit

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM