如何在三元条件运算符中使用 Optional 变量?
Posted
技术标签:
【中文标题】如何在三元条件运算符中使用 Optional 变量?【英文标题】:How do you use the Optional variable in a ternary conditional operator? 【发布时间】:2015-01-09 00:03:02 【问题描述】:我想在三元条件运算符中使用 Optional 变量,但它会抛出错误:optional 不能用作布尔值。我做错了什么?
var str1: String?
var myBool:Bool
myBool = str1 ? true : false
【问题讨论】:
【参考方案1】:为了补充已经非常好的答案,有时您需要三元运算符的便利性,但还需要对包装的值进行更改,例如;
var fullName = lastName != nil ? "\(firsName) \(lasName!)" : firstName
但您不想强制展开(即使这种情况也可以)。
那么你就可以实际使用Optional.map
:
var fullName = lastName.map( "\(firstName) \($0)" ) ?? firstName
仅当包装值 ($0
) 不是 nil
时才调用传递给 .map
的完成块。否则,该函数只会返回 nil
,然后您可以轻松地将其与 ??
运算符合并。
【讨论】:
【参考方案2】: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。
【讨论】:
这个答案并没有解决 OP 对 Optionals 的具体要求【参考方案3】:如果比较基于某些条件
let sliderValue = Float(self.preferenceData.getLocationRadius().characters.count > 1 ?self.preferenceData.getLocationRadius():"0.1")
这里的函数 getLocationRadius() 返回一个字符串。如果我们不在 1 和 ?它会导致语法错误
【讨论】:
【参考方案4】:如果你想要的值是一个属性或函数调用的结果,这甚至很有效(在 Swift 3.0 中):
return peripheral?.connected ?? false
【讨论】:
这不是在回答同一个问题,因为您假设我们想要该值 - 如果它存在,否则为零。虽然我们想要两个不同的表达式 - 基于任意条件。类似 a>3 的东西? (4+7) : (6/4) 在 C 中。【参考方案5】:您不能将字符串值分配给 bool,但您可以检查它 str1 是否为 nil:
myBool = str1 != nil ? true : false
print(myBool)
因为 str1 为空,所以会打印 false。
【讨论】:
你不需要条件表达式,只需:myBool = str1 != nil
【参考方案6】:
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。
【讨论】:
以上是关于如何在三元条件运算符中使用 Optional 变量?的主要内容,如果未能解决你的问题,请参考以下文章