2017-05-06 39 views
0

以下代碼是我之前在我的應用程序中使用的代碼。Objective-C:如果一個對象屬於一個類,這是否意味着對象不是nil或null?

前:

if ([dic objectForKey:@"text"] isKindOfClass:[NSString class]] && [dic objectForKey:@"text"] != nil && [dic objectForKey:@"text"] != [NSNull Null]) { 
     NSString *text = [dic objectForKey:@"text"]; 
    } 

我已經改變了代碼下面的下面。

後:

if ([dic objectForKey:@"text"] isKindOfClass:[NSString class]]) { 
     NSString *text = [dic objectForKey:@"text"]; 
    } 

我相信結果應該是一樣的,但後者更整潔。爲了安全起見,我在問這個問題,以確保我對這個問題是正確的,而不是忽略任何東西。

+0

我會這樣寫:'id obj = dic [@「text」];如果([objc isKindOfClass:[NSString class]]){etc}'。但是請注意,在對類集羣進行測試時:http://stackoverflow.com/questions/1096772/is-it-safe-to-use-iskindofclass-against-an-nsstring-instance-to-determine-type – Koen

+1

該類集羣警告是有趣的一面,但這裏真的不適用。此外,這個問題的兩個最佳答案嚴重誤解了蘋果的觀點。 Apple只是建議如果你有一些接口規定一個對象是一種類型的接口,那麼你應該遵守該合同,並且你不應該再測試一下,看看它在幕後是否真的是另一個集羣的接口並嘗試利用這一點。在這種情況下,沒有這種合同。 – Rob

+0

順便說一句,您可以使用'dic [@「text」]'。 – Sulthan

回答

3

您的簡單代碼將工作。

如果[dic objectForKey:@"text"]nil,那麼調用isKindOfClass甚至沒有被調用,並且實際上返回false的結果。

如果[dic objectForKey:@"text"]nil,那麼它必須是一個NSStringtrue所以沒有必要檢查,看它是否是NSNull

換句話說,如果[[dic objectForKey:@"text"] isKindOfClass:[NSString class]]true,那麼你已經知道,這是不是nil你已經知道這是不是NSNull,因此不需要這些檢查。

+0

感謝您爲我確認這一點。我也是這麼想的。 – Weakman10122

相關問題