【问题标题】:Assignment in ternary conditional operator produces "Expression is not assignable" error三元条件运算符中的赋值产生“表达式不可赋值”错误
【发布时间】:2013-04-21 18:12:53
【问题描述】:

谁能告诉我为什么以下是可以的:

if (newEditingMode) {
    dayView.dayViewIsInEditingMode = YES;
}
else{
    dayView.dayViewIsInEditingMode = NO;
}

但以下给出了错误Expression is not assignable

newEditingMode ? dayView.dayViewIsInEditingMode = YES : dayView.dayViewIsInEditingMode = NO;

【问题讨论】:

  • 您不应该在三元运算符中执行赋值。三元运算符应为:<variable> = <condition> ? <true value> : <false value>。整个运算符的结果将是真值或假值。
  • @rmaddy 是的,似乎括号允许它编译,但 Metabble 和 rickyman 都给出了我在他们的答案中需要的代码。谢谢

标签: objective-c compiler-errors conditional variable-assignment ternary-operator


【解决方案1】:

您可以使用括号,它会编译。请尝试以下操作。

newEditingMode ? (dayView.dayViewIsInEditingMode = YES) : (dayView.dayViewIsInEditingMode = NO);

但是,您不应该在三元条件本身内执行赋值;你应该改用这个。

dayView.dayViewIsInEditingMode = newEditingMode ? YES : NO;

或者,在这种情况下,您可以完全删除三元组,因为它是多余的。

dayView.dayViewIsInEditingMode = newEditingMode;

【讨论】:

  • 是的。非常感谢。那行得通。当我允许的时候会接受你的回答。
  • 不需要任何括号。此答案中的第一行代码不正确。使用第二行代码(不带括号)或者更好的是,使用第三行。
  • @rmaddy 我不确定你是否说第一行不正确,因为它不是执行手头任务的正确方式,在这种情况下我同意,或者你可以得到它编译不带括号。阐明?此外,虽然不需要一些括号,例如第二行的括号和第一行的第一对括号,但为了保持一致性,我总是在所有三个部分上都使用它们。如果您能准确地阐明您认为应该用上面的行改变什么,我将不胜感激。 :)
  • 我的意思是第一行完全不合适 - 括号与否。括号可能允许它编译,但它的代码写得不好。当然,newEditingMode 周围的括号是没有意义的。
  • @rmaddy 在这种情况下,我同意。我应该更明确地说不应该使用第一行。我将相应地编辑这篇文章,并删除多余的括号。我并没有真正考虑它们是否有必要,我只是将它们置于(坏)习惯之外。感谢您花时间指出这一点。
【解决方案2】:

三元运算符对运算顺序做了很奇怪的事情。这是一个可能有帮助的可行解决方案。

dayView.dayViewIsInEditingMode = (newEditingMode ? YES : NO);

看到你在做什么,你也可以这样写:

dayView.dayViewIsInEditingMode = newEditingMode;

【讨论】:

  • 谢谢,你是对的。不过 Metabble 最先到达那里,所以我接受了他的回答。
  • +1。它非常接近,您实际上指出了替代解决方案,而我正在编辑我的解决方案以添加它们。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 2011-03-06
  • 2021-04-29
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多