Как кодировать и декодировать NSCalendarUnit

#ios #objective-c #nscalendar

#iOS #objective-c #nscalendar

Вопрос:

Как кодировать и декодировать NSCalendarUnit , как и другие объекты, например

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

Пытался сохранить NSCalendarUnit NSNumber таким @(self.repetition); образом, но я получаю 64 при входе в систему.

Я хочу закодировать NSCalendarUnit и сохранить его, позже, когда потребуется, расшифруйте его и используйте для сравнения следующим образом if(xxxxx == NSCalendarUnit)

Ответ №1:

NSCalendarUnit является беззнаковым long, поэтому его можно «вставить» (превратить в объект) с помощью двух методов 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;
}
  

Ответ №2:

NSCalendarUnit является параметром set ( NS_OPTIONS ), что означает NSCalendarUnit , что значением может быть ни одно, одно или несколько значений единиц измерения. Вам нужно будет сделать битовую маску if ((xxxx amp; NSCalendarUnitHour) != 0) для проверки значений.

Вы нормально кодируете значение, как сейчас, как a NSNumber и используете NSNumber.unsignedInteger для получения значения при декодировании (обратите внимание, что перечисление для NSCalendarUnit определяется как a NSUInteger ). (Обратите внимание, что вы также можете сохранить значение как NSInteger using -[NSCoder encodeInteger:forKey:] .)

Сериализация

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

Десериализация

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

Проверка

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