大佬教程收集整理的这篇文章主要介绍了如何在Swift中打开任意深度嵌套的选项?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
任意深度嵌套的选项的示例是Optional< Optional< Optional< Int>>>和可选<可选<可选<可选< Int>>>>.
我发现这样做的唯一方法是使用类型擦除:
protocol TypeErasedoptional { func deeplyUnwrap() -> Any? } extension Optional: TypeErasedoptional { func deeplyUnwrap() -> Any? { switch self { case .none: return nil case @L_392_5@me(let wrapped as TypeErasedoptional): return wrapped.deeplyUnwrap() case @L_392_5@me(let wrapped): return wrapped } } func unwrap<T>(_ type: T.Type = T.self) -> T? { switch deeplyUnwrap() { case .none: return nil case @L_392_5@me(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 { $0.flatten() } ?? nil } func flatten<T>() -> T? where Wrapped == T?? { return map { $0.flatten() } ?? nil } func flatten<T>() -> T? where Wrapped == T??? { return map { $0.flatten() } ?? nil } func flatten<T>() -> T? where Wrapped == T???? { return map { $0.flatten() } ?? nil } func flatten<T>() -> T? where Wrapped == T????? { return map { $0.flatten() } ?? nil } }
上述解决方案的优点是类型安全的事实,缺点是它是静态类型的(例如,不能在任何变量上调用flatten()),并且如果需要,您需要添加越来越多的重载支持越来越多的嵌套级别.
以上是大佬教程为你收集整理的如何在Swift中打开任意深度嵌套的选项?全部内容,希望文章能够帮你解决如何在Swift中打开任意深度嵌套的选项?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。