我有一个双打阵列,以及一个按下按钮清空阵列的按钮。我希望只有当数组的计数大于零时才启用该按钮。代码如下:
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。
答案 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