2016-11-29 1 views
0

J'utilise ce code pour coder et décoder NSCalenderUnitComment corriger la conversion implicite perd avertissement de précision entier

- (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; 
} 

Mais je reçois cet avertissement

conversion implicite perd précision entier: « unsigned long long » à 'NSCalendarUnit' (alias 'ENUM NSCalendarUnit')

Comment corriger le code pour supprimer ce Attention?

Répondre

0

Comme vous pouvez le voir le type de description de NSCalendarUnit

typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) 

Vous devez changer de _myNSCalendarUnit = [boxed unsignedIntegerValue] pour le type conforme. Le long long est défini par 64 bits, mais NSUInteger n'est pas (reference). Et quand créer en boîte, vous devez utiliser avec le même type de données

+0

mais j'ai utilisé numberWithUnsignedLong pour convertir en NSNumber ... va convertir en unsignedIntegerValue peut avoir un impact de façon? –

+0

La manière la plus appropriée est de créer [NSNumber numberWithUnsignedInteger: self.myNSCalendarUnit]; 'avec le type d'origine de NSCalendar (NSUInteger). Il ne devrait pas perdre de données de n'importe quel cas. De plus, dans votre code actuel, vous créez avec 'unsignedLong' mais obtenez avec' unsignedLongLong', ce n'est pas un nom d'utilisateur. – nynohu