2014-09-20 14 views
14

wiem, to może być to duplikat, ale mam około 30 niejawna konwersja Integer traci precyzję ostrzeżenia w moim projekcie Xcode ios po aktualizacji do wersji 6.Ostrzeżenie: niejawna konwersja traci precyzję Integer w Xcode 6

Pierwszy Przykład:

NSArray * stations = [self stationsJSON][KEY_ITEM_LIST]; 

int newSize = (stations.count + 1); // Implicit conversion loses Integer precision: 'unsigned long' to 'int' 

drugim przykładzie

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 
    int index = indexPath.row/2; // Implicit conversion loses Integer precision: 'long' to 'int' 
    ... 
} 

Wiem, co oznacza ostrzeżenie. Używanie NSIntegera może pomóc w uniknięciu tego ostrzeżenia.

Nie rozumiem, dlaczego nie było ostrzeżenia w Xcode 5? I dlaczego nie ma ostrzeżenie po tym, jak zmienić linię

int index = indexPath.row/2; 

do

int index = indexPath.row/2i; 

Odpowiedz

20

NSArray count jest NSUInteger.

NSIndexPath row to NSInteger. W systemach 64-bitowych NSUInteger i NSInteger są 64-bitowe, ale int jest 32-bitowe. Wartość nie będzie pasować, co spowoduje ostrzeżenie.

Najlepiej jest unikać int w iOS. Zamiast tego użyj tego samego typu, co wartości, z którymi masz do czynienia.

NSInteger index = indexPath.row/2; 

Prawdopodobnie widzisz te w Xcode 6 ze względu na domyślne ostrzeżenia. Możesz je łatwo zobaczyć w Xcode 5 z odpowiednimi ustawieniami ostrzeżeń i budowaniem dla 64-bitów.

32

Można zaktualizować ustawienia projektu, aby usunąć wszystkie

Implicit conversion loses integer precision ostrzeżenia, ustawiając

Implicit Conversion to 32 Bit Type do No

w ustawieniach kompilacji projektu.

enter image description here

+0

Nie powinien być drogą dla wszystkich, ale jeśli wiesz, co robić, to dobra wskazówka! –

+1

naprawdę przydatny dla każdego, kto pracuje z Unity w tej chwili – Tomskiis

0

Zawsze byłem zirytowany przez tych ostrzeżeń, więc wpadłem na proste rozwiązanie, aby uniknąć go:

@interface NSIndexPath(UnsignedIndex) 

@property (nonatomic, readonly) NSUInteger sectionIndex; 
@property (nonatomic, readonly) NSUInteger rowIndex; 

@end 

@implementation NSIndexPath(UnsignedIndex) 

- (NSUInteger)sectionIndex { 

    return (NSUInteger)self.section; 
} 

- (NSUInteger)rowIndex { 

    return (NSUInteger)self.row; 
} 

@end 

Wystarczy użyć rowIndex i sectionIndex właściwości z tej kategorii zamiast rzędu NSIndexPath i sekcji nieruchomości.