【发布时间】:2015-01-09 00:03:02
【问题描述】:
我想在三元条件运算符中使用 Optional 变量,但它会抛出错误:optional 不能用作布尔值。我做错了什么?
var str1: String?
var myBool:Bool
myBool = str1 ? true : false
【问题讨论】:
我想在三元条件运算符中使用 Optional 变量,但它会抛出错误:optional 不能用作布尔值。我做错了什么?
var str1: String?
var myBool:Bool
myBool = str1 ? true : false
【问题讨论】:
为了补充已经非常好的答案,有时您需要三元运算符的便利性,但还需要对包装的值进行更改,例如;
var fullName = lastName != nil ? "\(firsName) \(lasName!)" : firstName
但您不想强制展开(即使这种情况也可以)。
那么你就可以实际使用Optional.map:
var fullName = lastName.map({ "\(firstName) \($0)" }) ?? firstName
仅当包装值 ($0) 不是 nil 时才调用传递给 .map 的完成块。否则,该函数只会返回 nil,然后您可以轻松地将其与 ?? 运算符合并。
【讨论】:
Ternary operators 对三个目标进行操作。和 C 一样,Swift 只有一个 三元运算符,三元条件运算符(a ? b : c)。
tableView 上的使用示例 -
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return section == 2 ? 4 : 1
}
表示如果section等于2,则返回4,否则返回1。
【讨论】:
如果比较基于某些条件
let sliderValue = Float(self.preferenceData.getLocationRadius().characters.count > 1 ?self.preferenceData.getLocationRadius():"0.1")
这里的函数 getLocationRadius() 返回一个字符串。如果我们不在 1 和 ?它会导致语法错误
【讨论】:
如果你想要的值是一个属性或函数调用的结果,这甚至很有效(在 Swift 3.0 中):
return peripheral?.connected ?? false
【讨论】:
您不能将字符串值分配给 bool,但您可以检查它 str1 是否为 nil:
myBool = str1 != nil ? true : false
print(myBool)
因为 str1 为空,所以会打印 false。
【讨论】:
myBool = str1 != nil
Nil Coalescing Operator 也可以使用。 下面的代码使用三元条件运算符和强制展开 (a!) 在 a 不为 nil 时访问包裹在 a 中的值,否则返回 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 为 nil,则返回默认值 b。
【讨论】: