#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
}