2016-11-29 2 views
0

Я использую этот код для кодирования и декодирования NSCalenderUnitКак исправить неявное преобразование теряет целое прецизионного предупреждение

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

Смежные вопросы