【问题标题】:Result values in '? :' expression have mismatching types '()' and 'Bool' [duplicate]'? 中的结果值:' 表达式具有不匹配的类型 '()' 和 'Bool' [重复]
【发布时间】:2017-05-22 08:26:32
【问题描述】:

我有一个 Doubles 数组,还有一个按钮,按下该按钮会清空数组。我希望仅当数组的计数大于零时才启用按钮。代码如下:

var numbers: [Double] = [] //At some point I add some numbers here

numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true : deleteAllNumbersButton.isEnabled = false

编译器抱怨:

'? 中的结果值:' 表达式具有不匹配的类型 '()' 和 '布尔'

当放入 if statement 时,它工作得很好。我无法理解这里的问题。有没有人见过这个?我使用 XCode 8.2.1 和 Swift 3。

【问题讨论】:

  • 不要使用三元来进行副作用。这完全违背了他们的目的。
  • @Carcigenicate 你能解释一下,或者发布任何链接来阅读它吗?
  • 我会考虑重构为 deleteAllnumbersButton.isEnabled = numbers.count > 0 并在您从数组中推送或删除某些内容时调用它

标签: ios swift ternary-operator


【解决方案1】:

注意,我不了解 Swift,但这似乎不是 Swift 特有的问题。我无法解释确切的错误,但我可以告诉你如何正确编写它。

条件表达式几乎只在您需要为变量赋值或返回值时使用,并且恰好有 2 个选项可供选择。

这是您想要做的,但您以一种复杂的方式编写它,这可能会使编译器感到困惑。

在表达式中:

numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true
                  : deleteAllNumbersButton.isEnabled = false

因为“then”和“else”表达式都包含赋值,所以它们评估(我假设)为一个单元 (())/“void”。我猜这就是它对你大喊大叫的原因。使用三元组返回 Unit 是没有意义的(实际上,正如 cmets 中所述,运算符优先级是错误的真正原因)。

你的意思可能是:

deleteAllNumbersButton.isEnabled = numbers.count > 0 ? true : false

请注意,不是在条件表达式中进行赋值,而是对表达式的结果进行赋值。在无法进一步简化的情况下(见下文),这就是条件表达式的使用方式。

不过,这种新形式应该会引发危险信号。为什么条件表达式的计算结果为真/假?这几乎总是一种代码气味。考虑到条件已经计算为布尔值,这是多余的。

只需将其简化为:

deleteAllNumbersButton.isEnabled = numbers.count > 0

【讨论】:

  • 运算符 precedence 是编译器错误的原因,在链接到的线程中有很好的解释。
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 2019-01-14
  • 2023-04-10
  • 2017-09-01
  • 2016-03-02
  • 2019-07-11
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多