2016-11-29 2 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; 
} 

をエンコードおよびデコードするためにこのコードを使用しています。しかし、私はこの警告

暗黙の変換を取得していますが、整数精度を失う。「unsigned long型NSCalendarUnit 『(別名『列挙NSCalendarUnit』)「 に』長い

これを削除するには、コードを修正する方法警告?

答えて

0

あなたが準拠するタイプのため_myNSCalendarUnit = [boxed unsignedIntegerValue]に変更する必要がありNSCalendarUnit

typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) 

の記述タイプを見ることができるように。 long longは64ビットで定義されていますが、NSUIntegerは(reference)ではありません。 boxedを作成する場合は、同じデータ型を使用する必要がありますNSNumber *boxed = [NSNumber numberWithUnsignedInteger:self.myNSCalendarUnit];

+0

NSNumberに変換するためにnumberWithUnsignedLongを使用しました... unsignedIntegerValueに変換すると、ayの方法で影響を及ぼしますか? –

+0

最も適切な方法は、オリジナルタイプのNSCalendar(NSUInteger)で[NSNumber numberWithUnsignedInteger:self.myNSCalendarUnit];を作成することです。どんな場合でもデータを失ってはいけません。さらに、現在のコードでは、 'unsignedLong'で作成しますが、' unsignedLongLong'で取得すると、それは適切ではありません。 – nynohu

関連する問題