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

Result values in '? :' expression have mismatching types '()' and 'Bool'

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

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

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

编译器抱怨:

Result values in '? :' expression have mismatching types '()' and 'Bool'

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

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

条件表达式几乎只用在需要给变量赋值或return值时,并且有正好 2个选项可供选择。

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

表达式中:

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

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

您的意思可能是:

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

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

不过,这种新形式应该引起注意。为什么条件表达式的计算结果为 true/false?这几乎总是一种代码味道。考虑到条件已经评估为布尔值,这是多余的。

只需将其减少到:

deleteAllNumbersButton.isEnabled = numbers.count > 0