I have an array of Doubles, and a button which when pressed empties the array. I want the button to be enabled only when the count of the array is greater than zero. The code is the following:
var numbers: [Double] = [] //At some point I add some numbers here
numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true : deleteAllNumbersButton.isEnabled = false
The compiler complains:
Result values in '? :' expression have mismatching types '()' and 'Bool'
When put in an if statement
it works just fine though. I can't understand the issue here. Has anyone seen this before? I use XCode 8.2.1 and Swift 3.
Note, I don't know Swift, but this doesn't appear to be a Swift specific problem. I can't explain the exact error, but I can show you how to write it properly.
Conditional expressions are used almost exclusively when you need to assign something to a variable or return a value, and have exactly 2 options to choose from.
This is what you're trying to do, but you've written it in a convoluted way that's likely confusing the compiler.
In the expression:
numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true
: deleteAllNumbersButton.isEnabled = false
Because the "then" and "else" expressions both contain assignments, they evaluate (I'm assuming) to a Unit (()
)/"void". I'm guessing this is why it's yelling at you. It never makes sense to use a ternary to return a Unit (Actually, as noted in the comments, operator precedence is the real reason for the error).
What you likely meant was:
deleteAllNumbersButton.isEnabled = numbers.count > 0 ? true : false
Notice how instead of assigning in the conditional expression, the result of the expression is instead assigned. In cases that can't be simplified further (see below), this is how conditional expressions should be used.
This new form should raise red flags though. Why have the conditional expression evaluate to true/false? That's almost always a code smell. It's redundant given the condition already evaluates to a Boolean value.
Just reduce it down to:
deleteAllNumbersButton.isEnabled = numbers.count > 0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With