2011-01-05 8 views
2

以下は常にELSE句に当てはまる理由を理解しようとしています。私が理解できないことは、実際の値に関係なく(NSLogは0または1を示します)、これは常にelseにヒットすることです。理由は何ですか?objectForKeyを使用して目的関数-cに有効なブール条件式を書く方法

NSArrayのは、ここであなたのコードはかなり奇妙です

BOOL* instock = [item objectForKey:@"itemInStock"]; 
    obj.instock = instock; 
    NSLog(@"and it was %@", obj.instock); 
    if (obj.instock == YES) { 
     //do yes stuff 
    }else { 
     //do no stuff 
    } 

答えて

4

-fyi JSONオブジェクトから引き出される項目。 obj.instockの種類は何ですか?あなたの最初の行

BOOL* instock = [item objectForKey:@"itemInStock"]; 

はまったく意味がありません。 -objectForKey:BOOL*の値を返しません。 idを返します。私はここであなたが実際にNSNumber *を取得していると推測しています。NSNumber *BOOL *の内部に収まるため、正常に機能するようになっています(両方ともポインタなので)。同様にobj.instockNSNumber*となる可能性があります(何らかのオブジェクトでなければ、NSLog()はクラッシュします)。

ので、obj.instockNSNumber*であると仮定すると、あなたが望む条件はあなたにも試してみて、そうでないときにBOOL*を持って主張していないために、このコードを修正する必要があり、単純に

if ([obj.instock boolValue]) { 
    // yes 
} else { 
    // no 
} 

です。

+0

あなたは私の心を読んでいます。 +1 –

+0

優秀!返されたIDがわからなかった! (ありがとう!) –

1

NSLogには、%@が使用されています。
%@はオブジェクトを指します。オブジェクトではないBOOL* instockとは異なります。

これを修正する方法があります。
[item objectForKey:@"itemInStock"];はどのデータ型を返しますか?
それは例えばのNSNumberを返す場合は、行うことができます。

obj.instock = [[item objectForKey:@"itemInStock"] boolValue]; 
NSLog(@"and it was %d", obj.instock); 
if (obj.instock == YES) { 
    //do yes stuff 
}else { 
    //do no stuff 
} 

を繰り返しますが、それをする他の方法があります。

+0

彼の投稿されたコードがクラッシュしないと仮定すると、 'obj.instock'は' BOOL'ではなく 'id'(おそらく' NSNumber * ')です。その場合、投稿されたコードは機能しません。 –

+0

@ケビン:まず、彼の 'obj.instock'が' BOOL'ではないことをどうやって知っていますか?宣言が全くないので、obj.instockのデータ型はわかりません。次に、私のコードが意味することは、 'obj.instock'が' BOOL'データ型として宣言されていることです。 –

+0

'obj.instock'が' BOOL'だった場合、元のコードの 'NSLog'はクラッシュしました。だからこそ、私は自分の声明を「自分の投稿されたコードがクラッシュしないと仮定して」認定したのです。 –

関連する問題