如何解决隐式转换失去整数精度警告

问题描述:

我使用这个代码进行编码和解码​​如何解决隐式转换失去整数精度警告

- (void)encodeWithCoder:(NSCoder*)encoder { 
    [super encodeWithCoder:encoder]; 

    NSNumber *boxed = [NSNumber numberWithUnsignedLong:self.myNSCalendarUnit]; 
    [encoder encodeObject:boxed forKey:@"myNSCalendarUnit"]; 
    // ... 

} 

- (id)initWithCoder:(NSCoder*)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     NSNumber *boxed = [aDecoder decodeObjectForKey:@"myNSCalendarUnit"]; 
     _myNSCalendarUnit = [boxed unsignedLongLongValue]; 
     // ... 
    } 
    return self; 
} 

但我得到这个警告

隐式转换损失整数精度:“无符号长长”到 ‘NSCalendarUnit’(又名‘枚举NSCalendarUnit’)

如何正确的代码删除此 警告?

正如你可以看到NSCalendarUnit

typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) 
说明类型您应该改为 _myNSCalendarUnit = [boxed unsignedIntegerValue]为符合类型。 long long由64位定义,但NSUInteger不是( reference)。而当创建盒装,你应该使用相同的数据类型 NSNumber *boxed = [NSNumber numberWithUnsignedInteger:self.myNSCalendarUnit];

+0

但我用numberWithUnsignedLong转换成NSNumber ...将转换为unsignedIntegerValue可以影响在某种程度上? –

+0

最合适的方法是创建[NSNumber numberWithUnsignedInteger:self.myNSCalendarUnit];'带原始类型的NSCalendar(NSUInteger)。它不应该丢失任何情况下的数据。此外,在你当前的代码中,你使用'unsignedLong'创建,但是使用'unsignedLongLong'获取,这是不合理的。 – nynohu