评估Swift的Bool? for true / false / nil在一行?

时间:2015-11-25 19:27:29

标签: swift optional

我有很多像这样的代码:

if let x = optbool {
   return f(x)
} else {
   return false
}

这可以用一行表达吗?

5 个答案:

答案 0 :(得分:3)

以下声明等同于您的代码:

return optbool.map(f) ?? false

如果optbool == nil,则.map(f)返回nil, 并且nil-coalescing运算符?? false改变了这一点 到false

如果optbool != nil,则.map(f)返回f(optbool!), 这也是零合并算子的结果。

答案 1 :(得分:0)

试试这个:

return optbool != nil ? f(optbool!) : false

答案 2 :(得分:0)

只有当func f(x:Bool) - > Bool

时,您的代码才有效
func foo(b: Bool?)-> Bool {
    if let x = b {
        return f(x)
    } else {
        return false
    }
}

现在这个问题没有更多的逻辑......你可以使用其中一个

let res1 = f(b ?? false)
let res2 = f(b ?? true)
let res3 = !f(b ?? false)
let res4 = !f(b ?? true)

取决于你的f函数

答案 3 :(得分:0)

如果您将f功能定义为Bool的扩展名:

extension Bool {
    func f() -> Bool {
        return true // or false..
    }
}

然后你可以写

return x?.f() ?? false

return x?.f() == true

答案 4 :(得分:0)

如果您的问题确实存在:

  

这可以用一行表达吗?

答案无疑是肯定的:

if let x = optbool { return f(x) } else { return false }

- )

说真的,如果optbool不应该是nil,我宁愿把它写在两行:

guard let x = optbool else { return false }
return f(x)