2014-10-20 72 views
3

我以爲我明白這將如何工作,但也許我錯過了一些小事。我想根據另一個變量的值設置標籤的文本。三元運算符根據變量的值設置值

這是我寫的,但它始終返回null,並在編譯器拋出一個警告:

myLabel.text = [NSString stringWithFormat:@"%@", [[_singleDictionary objectForKey:_key] isEqual: @"1" ? @"Single" : @"Three"]]; 

編譯器會引發警告:

Format specifies type 'id' but the argument has type 'BOOL' (aka 'bool') 

我不知道爲什麼。我研究過三元運算符,當我構造類似的代碼時,我仍然得到警告。基本上,我想作以下if語句三元操作符:

if ([[_singleDictionary objectForKey:_key] == @"1"]) 
{ 
    myLabel.text = @"Single"; 
} 
else if ([[_singleDictionary objectForKey:_key] == @"3"]) 
{ 
    myLabel.text = @"Three"; 
} 
+0

嘗試在你的三元運算符周圍加上括號,以使它更清楚發生了什麼。 – thelaws 2014-10-20 20:26:34

+0

僅供參考 - 在這種情況下不需要使用'stringWithFormat'。 – rmaddy 2014-10-20 20:55:34

回答

2

你寫它的方式,它試圖評估@「1」,以確定哪些傳遞的isEqual來。我認爲如果你使用isEqual的結果作爲比較,它會做你想做的。就像這樣:

myLabel.text = [[_singleDictionary objectForKey:_key] isEqual: @"1"] ? @"Single" : @"Three"; 
+2

謝謝!這工作完美。這是一個全支架放置哈哈。謝謝! – drpcken 2014-10-20 20:31:13

+2

是的,這是一個支架放置。但是你無法從這一點中學到任何東西。瞭解錯誤意味着什麼更重要,以便將來可以發現類似的問題。 – 2014-10-20 20:35:04

3

你有你的括號放錯了地方,所以參數stringWithFormat的結果是:

[[_singleDictionary objectForKey:@"key"] isEqual:(@"1" ? @"Single" : @"Three")] 

換句話說,三元正在評估作爲參數isEqual,整個事物的類型爲BOOL。我認爲你的意思是這樣做,而不是:

[[_singleDictionary objectForKey:_key] isEqual: @"1"] ? @"Single" : @"Three"; 

你可能想分裂它,以便它不是全部在一行上。這可能會更容易閱讀。

解決這樣的問題在未來的關鍵是要明白錯誤意味着什麼。它試圖告訴你,您的stringWithFormat%@)中的格式說明符預期爲id,但取而代之的是BOOL。這應該是你的第一個線索,第二個參數不是返回一個字符串,就像你認爲的那樣,但是以某種方式評估爲一個布爾值。從那裏,你可能更容易發現大括號錯誤。

+1

+1您可能希望將其分開,以便它不在同一行上。這可能會更容易閱讀。 – zaph 2014-10-20 20:39:50