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

The*_*eoK 8 ternary-operator ios swift

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

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

numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true : deleteAllNumbersButton.isEnabled = false
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

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

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

Car*_*ate 24

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

三元表达式几乎完全使用,当你需要的东西分配给一个变量或返回一个值,并且有确切 2个选项可供选择.

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

在:

numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true
                  : deleteAllNumbersButton.isEnabled = false
Run Code Online (Sandbox Code Playgroud)

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

你的意思是:

deleteAllNumbersButton.isEnabled = numbers.count > 0 ? true : false
Run Code Online (Sandbox Code Playgroud)

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

这个新表格应该会引发危险信号.为什么要指定true/false?这几乎总是代码味道.鉴于条件已经计算为布尔值,这是多余的.

只需将其减少为:

deleteAllNumbersButton.isEnabled = numbers.count > 0
Run Code Online (Sandbox Code Playgroud)

  • 运算符*优先级*是编译器错误的原因,在链接到线程中很好地解释了它. (3认同)