2016-11-29 41 views
0

我使用這個代碼進行編碼和解碼​​如何解決隱式轉換失去整數精度警告

- (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’)

如何正確的代碼刪除此 警告?

回答

0

正如你可以看到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

相關問題