在内联条件语句中展开可选项

时间:2017-04-07 00:37:04

标签: swift

在Swift中,有没有办法在内联条件语句中展开可选项?有些情况下,无合并运算符??不起作用,例如必须在函数中使用可选的解包时。

例如,假设f具有签名func f(a:Int) -> Bool并且将A ? B : C读为if A { B } else { C },则以下内容可能有意义:

var c:Int?
let a:Bool = let b = c ? f(b) : false

显然,这可以使用!

来完成
let a:Bool = b != nil ? f(b!) : false

但我更愿意尽可能避免使用!

1 个答案:

答案 0 :(得分:1)

是。 map可以应用于可选项,如果值不是nil则执行闭包,否则返回nil。然后,您可以使用 nil coalescing运算符来展开map的结果:

let a = b.map { f($0) } ?? false

正如@Alexandar在评论中指出的那样,因为你的函数只需要一个参数,所以只需传递函数名即可编写map

let a = b.map(f) ?? false

完整示例

func f(_ a:Int) -> Bool {
    return a > 17
}

var b:Int? = 18

let a1 = b.map(f) ?? false

print(a1)  // true

b = nil

let a2 = b.map(f) ?? false

print(a2)  // false
func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
     

<强>描述

     

当此Optional实例不为nil时,计算给定的闭包,将未包装的值作为参数传递。   将map方法与一个返回非可选值的闭包一起使用。