2016-06-28 4 views
-3

文字列の長さをチェックしようとしていますが、コードが実行されてIFステートメントに当たったときにはunrecognized selectorが返されます。長さがNSStringで機能しないのはなぜですか?

ディメンションの値はストリングです。コンソールから

NSString * checkString = [myDictionary objectForKey:@"somekey"]; 
    NSLog(@"length: %lu", (unsigned long)[checkString length]); 

if([checkString length] > 0){ 

} 

ERROR:

長さ:0
[__NSCFNumber長さ]:簡単にするためにインスタンス

に送られ、認識されないセレクター:

NSString * checkString = @"my string"; //[myDictionary objectForKey:@"somekey"]; 
    NSLog(@"length: %lu", (unsigned long)[checkString length]); 

    if([checkString length] > 0){ 
} 

長さ:9
[__NSCFNumber長さ]:未認識セレクタは インスタンスに

なぜ送信?

+0

[myDictionary objectForKeyを:「somekey」@]キャストしてみてくださいよると –

+0

withFormat NSStringのへや使用文字列エラーには、それは 'NSString'ではなく、' NSString'であり、 'NSString'ではありません。しかし、奇妙なのは正しく「長さ:%lu」というログが記録されているため、問題はその直後です。クラッシュを引き起こすコードは何ですか? '' [[myDictionary objectForKey:@ "somekey"] isKindOfClass:[NSString class]] 'はTRUEを返しますか? – Larme

+3

実際のコードであれば、その出力は意味をなさない。実際にあなたがあなたの質問にコピー貼り付けされている実際のコードですか?あなたは、NSLogとifステートメントの両方が同じ変数を参照していると確信していますか? – dan

答えて

3

エラーは、インスタンスがNSStringではなく、NSNumberではないことを示しています。これはおそらくNSNumber[myDictionary objectForKey:@"somekey"]に保存したためです。

この値を保存する場所に[yourValueThatYouThinkItsAString stringValue]を入れてみてください。

私はあなたのコードを試しましたが、私は@ "私の文字列"の値を使ってエラーを取得していません。あなたは追加の引数、それを削除を持っているあなたのNSLogで():

NSString *checkString = [[myDictionary objectForKey:@"somekey"] stringValue]; 
NSLog(@"length: %lu", (unsigned long)[checkString length]); 

if([checkString length] > 0){ 

} 

PS:あなたは試すことができ

+0

いいえNSNumberではなく、辞書内の文字列です。 –

+1

いいえ:)私の編集をチェックしてください。 – AnthoPak

+0

修正された質問を確認してください。 –

1

lengthが作業していない理由は、です。それはNSString*ではありません。 Objective-Cが検証できないキャストにもかかわらず、辞書のオブジェクトはではなくNSNumber*です。そのため、コードはコンパイルされますが、実行に失敗します。

[myDictionary objectForKey:@"somekey"]呼び出しは、汎用オブジェクト参照であるidを返します。そのため、へのキャストを実行したときに、"somekey"のオブジェクトが実際に文字列であることを、Objective-Cが信頼する必要があります。

NSLogで長さが評価されないように間違えてしまったので、失敗しません。それが失敗見てNSLogを変更します。

NSLog(@"length: %lu", (unsigned long)[checkString length]); 

あなたはXCodeの7以降を使用している場合は、型チェックでのObjective-Cを助けるために軽量なジェネリック医薬品を使用することができます。コンパイラはあなたのための不正なキャストをキャッチすることができるようにあなたは、あなたの辞書にキーと値のオブジェクトの種類を指定することができます

NSDictionary<NSString*,NSString*> *myDictionary = ... 
+0

それからNSLogは0ですが、IFで失敗しますか?辞書の値は文字列です。 –

+0

改訂された質問を確認してください。 –

+0

@Firemarble改訂版の回答を確認してください。 – dasblinkenlight

関連する問題