我以为我理解这会如何起作用,但也许我错过了一些小事。我想根据另一个变量的值设置标签的文本。
这是我写的,但它总是返回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 :(得分:3)
你的大括号位于错误的位置,因此stringWithFormat
的参数是以下结果:
[[_singleDictionary objectForKey:@"key"] isEqual:(@"1" ? @"Single" : @"Three")]
换句话说,三元组正在评估isEqual
的参数,整个事物的类型为BOOL
。我认为你打算这样做,而不是:
[[_singleDictionary objectForKey:_key] isEqual: @"1"] ? @"Single" : @"Three";
您可能希望将其拆分,以便它不是全部在一条线上。这样阅读可能会更容易。
解决此类问题的关键是要了解错误的含义。它试图告诉您,stringWithFormat
(%@
)中的格式说明符需要id
,但却得到了BOOL
。这应该是你的第一个线索,第二个参数不是返回一个字符串,正如你所想的那样,但却以某种方式评估了一个布尔值。从那里,您可能更容易发现支撑错误。
答案 1 :(得分:2)
你写它的方式,它试图评估@“1”来确定传递给isEqual的内容。我想如果你改为使用isEqual的结果作为比较它会做你想要的。像这样:
myLabel.text = [[_singleDictionary objectForKey:_key] isEqual: @"1"] ? @"Single" : @"Three";