
可以说我有一个可选的float
let f: float? = 2
现在我想将它转换为Double
let d = Double(f) //fail
这显然会失败,但有没有办法通过函数链接可选的计算变量?我现在在做的是:
extension float { var double: Double { return Double(self) }}let d: Double? = f?.double 但我真的不喜欢将演员表作为计算变量.
我考虑使用的另一个选项是:
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) 我意识到我可以保护’f’的价值来解开它.但是,在许多情况下,可选值将是返回可选项的函数的参数.这导致防护中的中间值.如下例所示:
func foo(_ a: String?) throws -> float { guard let a = a,let intermediate = float(a) else { throw.something } return intermediate} 这里从String到float的转换也可能失败.
至少使用计算变量,这个foo函数更清晰一点
extension String { var float: float? { return float(self) }}func foo(_ a: String?) throws -> float { guard let a = a?.float else { throw.something } return a} 我不想重写频繁插入的可选版本.
任何想法将不胜感激.谢谢!
解决方法 您可以简单地使用Optional的map(_:)方法,该方法将返回包装的值,如果它是非零的,则应用给定的变换,否则它将返回nil. let f : float? = 2// If f is non-nil,return the result from the wrapped value passed to Double(_:),// else return nil.let d = f.map { Double(let d = f.map(Double.init)
) } 正如您在下面的评论中指出的那样,也可以说是:
Double 这是因为map(_ :)需要类型(float)的转换函数 – >在这种情况下加倍,而flatMap(_:)‘s float initialiser就是这样一个功能.
如果转换也返回一个可选项(例如将String转换为Int时),则可以使用
let s : String? = "3"// If s is non-nil,return the result from the wrapped value being passed to the Int(_:)// initialiser. If s is nil,or Int() returns nil,return nil.let i = s.flatMap { Int() },它只是将nil转换结果传播回调用者: 总结 以上是内存溢出为你收集整理的通过Swift中的函数(或Init)传播可选项全部内容,希望文章能够帮你解决通过Swift中的函数(或Init)传播可选项所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)