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

时间:2017-01-07 18:24:39

标签: ios swift ternary-operator

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

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。

1 个答案:

答案 0 :(得分:21)

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

三元表达式几乎只在您需要为变量赋值或返回值时使用,并且完全 2个选项可供选择。

这是你要做的,但是你已经用一种令人费解的方式编写它,这可能会让编译器感到困惑。

在表达式中:

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

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

你可能意味着:

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

请注意,不是在三元组中分配,而是分配三元组的结果。在无法进一步简化的情况下(见下文),这就是应该如何使用三元组。

这个新表格应该会引发红旗。为什么三元评估为真/假?这几乎总是代码味道。鉴于条件已经评估为布尔值,它是多余的。

将其简化为:

deleteAllNumbersButton.isEnabled = numbers.count > 0