首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编解码NSCalendarUnit

如何编解码NSCalendarUnit
EN

Stack Overflow用户
提问于 2016-10-02 13:22:17
回答 2查看 136关注 0票数 1

如何像其他对象一样编码和解码NSCalendarUnit,如

代码语言:javascript
复制
self.myStr = [decoder decodeObjectForKey:@"myStr"];
[encoder encodeObject:self.myStr forKey:@"myStr"];

试图将NSCalendarUnit保存在NSNumber中,像这样的@(self.repetition);,但是当我登录时会得到64

我想对NSCalendarUnit进行编码并保存,稍后必要时对其进行解码,并使用它进行比较,如下面的if(xxxxx == NSCalendarUnit)所示

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-02 15:57:42

NSCalendarUnit是一个无符号长,因此可以使用NSNumber上的两个方法对未签名的long进行“装箱”(使其成为一个对象):

代码语言:javascript
复制
NSCalendarUnit someNSCalendarUnit = NSCalendarUnitDay;
NSNumber *boxed = [NSNumber numberWithUnsignedLong:someNSCalendarUnit];

代码语言:javascript
复制
NSCalendarUnit unboxed = [boxed unsignedLongLongValue];
// now, unboxed == someNSCalendarUnit

您可能知道如何编码解码NSNumbers,只需在编码/解码方法中添加附加的方框步骤.

代码语言:javascript
复制
- (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;
}
票数 1
EN

Stack Overflow用户

发布于 2016-10-02 13:27:12

NSCalendarUnit是一个选项集(NS_OPTIONS),这意味着NSCalendarUnit值可以是单元的任何值、一个值或多个值。您需要执行一个位掩码 if ((xxxx & NSCalendarUnitHour) != 0)来检查值。

您可以像现在一样将值编码为NSNumber,并在解码时使用NSNumber.unsignedInteger获取值(请注意,NSCalendarUnit的枚举被定义为NSUInteger)。(注意,还可以使用NSInteger将值存储为-[NSCoder encodeInteger:forKey:]。)

Serialisation

代码语言:javascript
复制
[encoder encodeObject:@(self.repetition) forKey:@"repetition"];

Deserialisation

代码语言:javascript
复制
self.repetition = [[decoder decodeObjectOfClass:[NSNumber class] 
                   forKey:@"repetition"] unsignedInteger];

检查

代码语言:javascript
复制
if ((self.repetition & NSCalendarUnitHour) != 0) {
    // Do something
} else if ((self.repetition & NSCalendarUnitMinute) != 0) {
    // Do something
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39817462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档