如何在三元条件运算符中使用Optional变量?

时间:2014-11-12 07:54:10

标签: swift ternary-operator

我想在三元条件运算符中使用一个Optional变量,但是它会抛出错误: optional不能用作布尔值。我做错了什么?

var str1: String?
var myBool:Bool
myBool = str1 ? true : false

6 个答案:

答案 0 :(得分:78)

你不能将字符串值赋给bool,但你可以检查str1是否为nil:

myBool = str1 != nil ? true : false
print(myBool)

它将打印为false,因为str1为空。

答案 1 :(得分:65)

也可以使用Nil Coalescing Operator。 下面的代码使用三元条件运算符和强制解包(a!)来访问包含在a不是nil时的值,否则返回b

普通三元运算符:

output = a != nil ? a! : b Apple Developer Link:请参阅Demo Link

在Swift 1.2& 2,上面的代码行被更短的格式替换:

output = a ?? b

Demo Link:nil合并运算符(a ?? b)如果包含值,则展开可选a;如果a为n,则返回默认值b。

答案 2 :(得分:4)

如果您想要的值是可选的函数调用的属性或结果(在Swift 3.0中),这甚至可以正常工作:

return peripheral?.connected ?? false

答案 3 :(得分:4)

  

Ternary operators对三个目标进行操作。像C一样,Swift只有一个   三元运算符,三元条件运算符(a?b:c)。

tableView上的用法示例 -

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return section == 2 ?  4 :  1
}

表示如果段等于2,则返回4,否则返回1。

答案 4 :(得分:1)

要添加已经非常好的答案,有时您需要三元运算符的便利,但还需要对包装的值进行更改,例如;

var fullName = lastName != nil ? "\(firsName) \(lasName!)" : firstName

但是您不想强行打开包装(即使这种情况很好)。

那么您实际上可以使用Optional.map

var fullName = lastName.map({ "\(firstName) \($0)" }) ?? firstName

仅当包装值(.map)不是$0时,才调用传递到nil的完成块。否则,该函数只会返回nil,然后您可以轻松地与??运算符合并。

答案 5 :(得分:0)

如果比较基于某些条件

 let sliderValue = Float(self.preferenceData.getLocationRadius().characters.count > 1 ?self.preferenceData.getLocationRadius():"0.1")

这里函数getLocationRadius()返回一个String。还有一件事,如果我们不在1和?之间放置一个空格?它会导致语法错误