【问题标题】:Ternary operator to set value based on value of variable三元运算符根据变量的值设置值
【发布时间】:2014-12-15 22:30:09
【问题描述】:

我以为我明白这是如何工作的,但也许我遗漏了一些小东西。我想根据另一个变量的值来设置标签的文本。

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

【问题讨论】:

  • 尝试在您的三元运算符周围加上方括号,以便更清楚地了解发生了什么。
  • 仅供参考 - 在这种情况下不需要使用 stringWithFormat

标签: ios objective-c ternary-operator


【解决方案1】:

你的大括号放错了位置,所以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";

【讨论】:

  • 谢谢!那工作得很好。这是一个全支架放置哈哈。谢谢!
  • 是的,这是一个支架放置。但是你不能仅仅从中学到任何东西。了解该错误的含义更为重要,这样您以后才能发现类似的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多