protocol Convertable { associatedtype targettype func convert() -> targettype}func show<T : Convertable where T.targettype == String>(toShow : T) { print(toShow.convert())}func add<T : Convertable where T.targettype == Int>(a : T,b : T) -> Int { return a.convert() + b.convert()}struct MyData { var data : Int}
作为扩展,我使结构符合targettype将为String的协议,以便将其传递给show方法:
extension MyData : Convertable { func convert() -> String { return String(self.data) }}
到目前为止一切都按预期工作.但是现在我也希望在targettype绑定到Int时使结构符合Convertable协议.哪个似乎不可能?
我尝试的第一件事是将convert方法的第二个定义添加到扩展名:
extension MyData : Convertable { func convert() -> String { return String(self.data) } func convert() -> Int { return data }}
编译器现在抱怨MyData不再符合协议.其次是将其拆分为两个扩展并显式绑定targettype.
extension MyData : Convertable { typealias targettype = Int func convert() -> Int { return data }}extension MyData : Convertable { typealias targettype = String func convert() -> String { return String(data) }}
这会产生编译器现在抱怨重新定义targettype的效果.
我的最后一次尝试是定义两个扩展Convertable协议并约束targettype的协议,然后通过扩展实现它们:
protocol ConvertableString : Convertable { associatedtype targettype = String}protocol ConvertableInt : Convertable { associatedtype targettype = Int}extension MyData : ConvertableInt { func convert() -> Int { return self.data }}extension MyData : ConvertableString { func convert() -> String { return String(self.data) }}
现在这使得编译器对扩展感到满意,但不再需要调用show,因为它不知道它可以使用MyData调用该函数.
是否有一些事情我已经监督过或者目前在swift中是不可能的?
解决方法 我只是资助一种存档方式.诀窍是在协议的一个子类型中添加另一个关联类型:protocol ConvertableInt : Convertable { associatedtype TResI typealias targettype = TResI}extension MyData : Convertable { typealias targettype = String func convert() -> String { return String(self.data) }}extension MyData : ConvertableInt { typealias TResI = Int func convert() -> TResI { return self.data }}
这也允许摆脱字符串的第二个子类型.
虽然这通过了编译器,但它在运行时完全崩溃了!
编译器始终调用在显式类型中定义的已定义方法.在这种情况下:
typealias targettype = String
这将导致将地址解释为整数并给出完全错误的结果.如果你定义它反之亦然它会崩溃,因为它试图将整数解释为一个地址.
总结以上是内存溢出为你收集整理的swift – 实现具有不同关联类型的协议全部内容,希望文章能够帮你解决swift – 实现具有不同关联类型的协议所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)