如何解决隐式转换失去整数精度警告
问题描述:
我使用这个代码进行编码和解码如何解决隐式转换失去整数精度警告
- (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];
但我用numberWithUnsignedLong转换成NSNumber ...将转换为unsignedIntegerValue可以影响在某种程度上? –
最合适的方法是创建[NSNumber numberWithUnsignedInteger:self.myNSCalendarUnit];'带原始类型的NSCalendar(NSUInteger)。它不应该丢失任何情况下的数据。此外,在你当前的代码中,你使用'unsignedLong'创建,但是使用'unsignedLongLong'获取,这是不合理的。 – nynohu