如何在三元条件运算符中使用 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 变量?的主要内容,如果未能解决你的问题,请参考以下文章

第二十二节,三元运算

三元条件运算符中的多个条件?

如何使用三元运算符中的枚举检查两个条件?

如何在python中编写三元条件运算符? [复制]

如何使用条件三元运算符在 lambda 之间有条件地分配 Func<>?

变量的管理 -三元运算