2017-05-06 3 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 "]; if([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

そのクラスター警告は面白い副作用ですが、ここでは実際には適用できません。さらに、その質問に対する2つのトップの答えは、Appleのポイントを真剣に誤解しています。 Appleは、オブジェクトが1つのタイプであることを規定したインタフェースがあれば、その契約に従うべきであり、実際にはクラスタの別のものであるかどうかをテストするべきではないとアドバイスしているだけですそれを利用しようとします。この場合、そのような契約はありません。 – Rob

+0

ところで、あなたは 'dic [@" text "]'を使うことができます。 – Sulthan

答えて

3

あなたの単純なコードは機能します。

[dic objectForKey:@"text"]nilの場合、isKindOfClassへの呼び出しは呼び出されず、効果的にfalseという結果が返されます。

[dic objectForKey:@"text"]nilされていない場合、それはtrueすべきNSStringでなければならないので、それがNSNullであるかどうかを確認する必要はありません。言い換えれば

[[dic objectForKey:@"text"] isKindOfClass:[NSString class]]trueであれば、あなたはすでにそれがnilではなかったことを知っているとあなたはすでにそれがNSNullではないことを知っているので、それらのチェックが必要とされていません。

+0

私にこれを確認していただきありがとうございます。私は同じことを考えました。 – Weakman10122

関連する問題