如何在Swift中打开任意深度嵌套的选项?

如何在Swift中打开任意深度嵌套的选项?,第1张

概述作为 Swift中的一个练习,我正在尝试编写一个扩展方法,它将解包任意深度嵌套选项.这几乎没有实际用途,只是对Swift类型系统的探索. 任意深度嵌套的选项的示例是Optional< Optional< Optional< Int>>>和可选<可选<可选<可选< Int>>>>. 我发现这样做的唯一方法是使用类型擦除: protocol TypeErasedOptional { func 作为 Swift中的一个练习,我正在尝试编写一个扩展方法,它将解包任意深度嵌套的选项.这几乎没有实际用途,只是对Swift类型系统的探索.

任意深度嵌套的选项的示例是Optional< Optional< Optional< Int>>>和可选<可选<可选<可选< Int>>>>.

我发现这样做的唯一方法是使用类型擦除:

protocol TypeErasedOptional {    func deeplyUnwrap() -> Any?}extension Optional: TypeErasedOptional {    func deeplyUnwrap() -> Any? {        switch self {        case .none: return nil        case .some(let wrapped as TypeErasedOptional): return wrapped.deeplyUnwrap()        case .some(let wrapped): return wrapped        }    }    func unwrap<T>(_ type: T.Type = T.self) -> T? {       switch deeplyUnwrap() {       case .none: return nil       case .some(let wrapped as T): return wrapped       default: return nil       }    }}

这很好用.我们可以打开一个深层嵌套的可选项,但遗憾的是我们必须重新编写Wrapped类型:

let x = Optional<Optional<Optional<Int>>>(3)let y = x.unwrap(Int.self)

没有类型擦除,我想不出任何方法可以做到这一点.一旦你使用了类型擦除,你必须重新设置类型才能恢复它.我不想要这个.有更多精通斯威夫特的人可​​以让我知道这不可能做到或者是否有另一种方式?

解决方法 这是一个解决方案,提供最多六个级别的展平选项:

extension Optional {    func flatten() -> Wrapped? {        return self    }    func flatten<T>() -> T? where Wrapped == T? {        return map { .flatten() } ?? nil    }    func flatten<T>() -> T? where Wrapped == T?? {        return map { .flatten() } ?? nil    }    func flatten<T>() -> T? where Wrapped == T??? {        return map { .flatten() } ?? nil    }    func flatten<T>() -> T? where Wrapped == T???? {        return map { .flatten() } ?? nil    }    func flatten<T>() -> T? where Wrapped == T????? {        return map { .flatten() } ?? nil    }}

上述解决方案的优点是类型安全的事实,缺点是它是静态类型的(例如,不能在任何变量上调用flatten()),并且如果需要,您需要添加越来越多的重载支持越来越多的嵌套级别.

总结

以上是内存溢出为你收集整理的如何在Swift中打开任意深度嵌套的选项?全部内容,希望文章能够帮你解决如何在Swift中打开任意深度嵌套的选项?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1018460.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存