How do you use the Optional variable in a ternary conditional operator?
SwiftTernary OperatorSwift Problem Overview
I want to use an Optional variable with the ternary conditional operator but it is throwing error this error: optional cannot be used as boolean. What am I doing wrong?
var str1: String?
var myBool:Bool
myBool = str1 ? true : false
Swift Solutions
Solution 1 - Swift
You can not assign string value to bool but You can check it str1 is nil or not like this way :
myBool = str1 != nil ? true : false
print(myBool)
It will print false because str1 is empty.
Solution 2 - Swift
Nil Coalescing Operator can be used as well. The code below uses the ternary conditional operator and forced unwrapping (a!) to access the value wrapped inside a when a is not nil, and to return b otherwise
Normal Ternary Operator :
output = a != nil ? a! : b
Apple Developer Link : Please refer to Demo Link
In Swift 1.2 & 2, above line of code is replaced by a shorter format:
output = a ?? b
Demo Link : The nil coalescing operator (a ?? b) unwraps an optional a if it contains a value, or returns a default value b if a is nil.
Solution 3 - Swift
This even works well if the value you want is a property or result of a function call on an optional (in Swift 3.0):
return peripheral?.connected ?? false
Solution 4 - Swift
> Ternary operators operate on three targets. Like C, Swift has only one > ternary operator, the ternary conditional operator (a ? b : c).
Example usage on tableView
-
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return section == 2 ? 4 : 1
}
indicates if section equal to 2 then it return 4 otherwise 1 on false.
Solution 5 - Swift
To add on the already very good answers, sometimes you need the convenience of the ternary operator but also need to perform changes on the wrapped value, such as;
var fullName = lastName != nil ? "\(firsName) \(lasName!)" : firstName
But you don't want to force unwrap (even though this situation would be fine).
Then you can actually use Optional.map
:
var fullName = lastName.map({ "\(firstName) \($0)" }) ?? firstName
The completion block passed to .map
is only called if the wrapped value ($0
) is not nil
. Otherwise, that function just returns nil
, which you can then easily coalesce with the ??
operator.
Solution 6 - Swift
In case the comparison is based on some condition
let sliderValue = Float(self.preferenceData.getLocationRadius().characters.count > 1 ?self.preferenceData.getLocationRadius():"0.1")
Here the function getLocationRadius() returns a String. One more thing if we don't put a space between 1 and ? it results in an syntax error