gpt4 book ai didi

swift - 在 Swift 中通过函数(或 Init)传播可选值

转载 作者:搜寻专家 更新时间:2023-10-30 23:09:24 24 4
gpt4 key购买 nike

有没有人有(更好的)方法来做到这一点?

假设我有一个可选的 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
}

我不想重写频繁初始化的可选版本。

任何想法将不胜感激。谢谢!

最佳答案

您可以简单地使用Optionalmap(_:)方法,如果它不是 nil,它将返回应用给定转换的包装值,否则它将返回 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($0) }

正如您在下面的评论中指出的,也可以表示为:

let d = f.map(Double.init)

这是因为 map(_:) 在这种情况下需要类型为 (Float) -> Double 的转换函数,并且 Double's float initialiser 就是这样的函数。

如果转换也返回可选值(例如将 String 转换为 Int 时),您可以使用 flatMap(_:) ,它只是将 nil 转换结果传播回调用者:

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($0) returns nil, return nil.
let i = s.flatMap { Int($0) }

关于swift - 在 Swift 中通过函数(或 Init)传播可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com