How do you use the Optional variable in a ternary conditional operator?

SwiftTernary Operator

Swift 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionYashwanth ReddyView Question on Stackoverflow
Solution 1 - SwiftDharmesh KheniView Answer on Stackoverflow
Solution 2 - SwiftAbhijeetView Answer on Stackoverflow
Solution 3 - SwiftRobert AtkinsView Answer on Stackoverflow
Solution 4 - SwiftJackView Answer on Stackoverflow
Solution 5 - SwiftSkwiggsView Answer on Stackoverflow
Solution 6 - SwiftMuhammad NayabView Answer on Stackoverflow