大佬教程收集整理的这篇文章主要介绍了swift – 通用约束类型的默认值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
protocol JSONParserType { associatedtype Element } // MARK: - Entities struct Item {} // MARK: - Parsers struct OuterParser<T: JSONParserType where T.Element == Item>: JSONParserType { typealias Element = Item let innerParser: T init(innerParser: T = InnerParser()) { self.innerParser = innerParser } } struct InnerParser: JSONParserType { typealias Element = Item }
OuterParser有一个子解析器,应该被约束到一个特定的类型.不幸的是,在初始化程序中(或在属性定义本身中)提供默认值会导致编译器抛出“类型为’InnerParser’的默认参数值’无法转换为类型’T’”.
如果我删除默认值赋值并只是实例化显式提供InnerParser的OuterParser,一切都很好.
let outerParser = OuterParser(innerParser: InnerParser())
struct AnotherParser: JSONParserType { typealias Element = Item }
我们假设你当前的代码编译.现在考虑一下当你这样做时会发生什么:
let parser = OuterParser<AnotherParser>()
您已将泛型类型定义为AnotherParser – 但初始化程序将尝试将InnerParser分配给您的属性(现在类型为AnotherParser).这些类型不匹配,因此无法工作.
遵循相同的逻辑,此实现也将不起作用:
struct OuterParser<T: JSONParserType where T.Element == Item>: JSONParserType { typealias Element = Item let innerParser: T init() { self.innerParser = InnerParser() } init(innerParser: T) { self.innerParser = innerParser } }
因为不能保证泛型类型T与InnerParser的类型相同.当然,你可以强制转发为T – 但如果类型不兼容,这只会让你的代码崩溃.
不幸的是,这个问题没有真正干净的解决方案.我认为最好的选择可能是创建两个工厂方法来创建OuterParser实例.
enum Parser { static func createParser() -> OuterParser<InnerParser> { return OuterParser(innerParser:InnerParser()) } static func createParser<T>(innerParser:T) -> OuterParser<T> { return OuterParser(innerParser:innerParser) } }
let innerParser = Parser.createParser() // OuterParser<InnerParser> let anotherParser = Parser.createParser(AnotherParser()) // OuterParser<AnotherParser>
以上是大佬教程为你收集整理的swift – 通用约束类型的默认值全部内容,希望文章能够帮你解决swift – 通用约束类型的默认值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。