2014-10-20 71 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