2012-01-23 6 views
4

次のObjective-Cステートメントは正しく動作しません。Objective-Cで三項演算子を使用する場合の制限はありますか?

cell.templateTitle.text=[(NSDictionary*) [self.inSearchMode?self.templates:self.filteredTemplates objectAtIndex:indexPath.row] objectForKey:@"title"]; 

ただし、私はif()ステートメントに分割しても問題ありません。

if(self.inSearchMode){ 
    categorize=[(NSDictionary*)[self.filteredTemplates objectAtIndex:indexPath.row] objectForKey:@"categorize"]; 
} else { 
    categorize=[(NSDictionary*)[self.templates objectAtIndex:indexPath.row] objectForKey:@"categorize"]; 
} 

Objective-Cで三項演算子を使用する際の制限はありますか? C#のような他の言語では、上記の3つのステートメントは正しく動作していました。

+0

どのようなエラーを得るのですか? –

+0

エラーはありません。ちょうどその結果はゼロです。 – ChrisP

+0

コードは同じではありません。コードの両方のビットは、正反対のテンプレートに正確にアクセスします。それらのうちの1つは間違っており、どちらを言うのも不可能です。 – gnasher729

答えて

10

私の推測では、操作の問題の順序です。あなたは試してみました:

[(self.inSearchMode?self.templates:self.filteredTemplates) objectAtIndex:indexPath.row] 

(通知は括弧を追加しました)

8

@cesarislawは、操作の順序についておそらく正しいです。 (そしてあなたが本当に三項演算子の使用を主張すれば;)

あなたの代わりにこのような何かを行う場合は、コードが読みやすくなります):あなたは

NSDictionary * templates = (NSDictionary *) (self.inSearchMode ? self.filteredTemplates : self.templates); 

categorize = [[templates objectAtIndex:indexPath.row] objectForKey:@"categorize"]; 
+0

より読みやすく、正確に速く、デバッグにはるかに優れています。テンプレートディクショナリがnilであるかどうかを確認するには、ブレークポイントを設定するだけです。私はobjectAtIndexの結果のために別のステートメントを追加します。 – gnasher729

関連する問題