這是一個關(guān)于類型轉(zhuǎn)換的問題捡絮。
很多時候我們在獲取網(wǎng)絡(luò)傳輸過來的數(shù)據(jù),還有獲取一個id類型的數(shù)組中元素的時候,通常會進行類型轉(zhuǎn)換衰猛,只是有時候類型轉(zhuǎn)換也是會出現(xiàn)問題的。
例子1:
NSString *num = @"1";
long newNum = [num longValue];
NSLog(@"num=: %ld", newnum);
其實這段編譯是會報錯的但是刹孔,有集中情況是可以通過編譯的啡省。
例子2:
NSString *num2 = @"22";
NSDictionary *dict = @{@"num2": num2};
long newnum = [[dict objectForKey: @"num2"] longValue];
NSLog(@"num2: %ld", num2);
例子3:
NSString *num3 = @"333";
NSArray *array = @[ num3 ];
long newnum = [array[0] longValue] ;
NSLog(@"num3: %ld", num3);
以上兩種情況編譯都不會出現(xiàn)問題,但是當(dāng)運行時就會發(fā)生錯誤髓霞,因為NSString類型是沒有l(wèi)ongValue的方法的卦睹,它是NSNumber的方法,同理
usignedLongValue方库,NSString中也是沒有usignedLongValue方法的结序,所以在進行任何類型的轉(zhuǎn)換之前先確定對象是不是能夠調(diào)用該方法。
respondsToSelector是很好的保護機制纵潦,在不知道數(shù)據(jù)類型的時候可以使用id 來接收然后通過判斷在轉(zhuǎn)換成對應(yīng)的需要的類型
比如:接著上面array
for (int i = 0;i <array.count;i++){
id objc = array[i];
if ([objc respondsToSelector:@selector(LongValue)]){
long newnum = [objc longValue] ;
}
}
這樣的話就不會由于調(diào)用了沒有的方法而報錯了徐鹤。
這里至在說明,在進行類型轉(zhuǎn)換的時候需要謹慎邀层,最好查看下手冊返敬,看看是不是支持這樣的轉(zhuǎn)換。