有没有人(更好)的方式来做到这一点?
可以说我有一个可选的Float
let f: Float? = 2
Run Code Online (Sandbox Code Playgroud)
现在我想将它转换为Double
let d = Double(f) //fail
Run Code Online (Sandbox Code Playgroud)
这显然会失败,但有没有办法通过函数链接可选的计算变量?我现在在做的是:
extension Float {
var double: Double { return Double(self) }
}
let d: Double? = f?.double
Run Code Online (Sandbox Code Playgroud)
但我真的不喜欢将演员表作为计算变量.
我考虑使用的另一个选项是:
public func optionalize<A,B>(_ ? : @escaping (A) -> B) -> (A?) -> B? {
return { (a) in
guard let a = a else { return nil }
return ?(a)
}
}
let d: Double? = optionalize(Double.init)(f)
Run Code Online (Sandbox Code Playgroud)
我意识到我可以保护'f'的价值来解开它.但是,在许多情况下,可选值将是返回可选项的函数的参数.这导致防护中的中间值.如下例所示:
func foo(_ a: String?) throws -> Float {
guard
let …Run Code Online (Sandbox Code Playgroud) 什么是实施这个的正确方法?最好是一行.
var name: String?
...
let username = "@" + name
Run Code Online (Sandbox Code Playgroud)
注意:username必须是String?我不想打开name连接.
编辑:如果name是nil,username也应该nil.