三元运算符根据变量值设置值

时间:2014-10-20 20:18:26

标签: ios objective-c ternary-operator

我以为我理解这会如何起作用,但也许我错过了一些小事。我想根据另一个变量的值设置标签的文本。

这是我写的,但它总是返回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";
}

2 个答案:

答案 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";