swift – 实现具有不同关联类型的协议
我有一个协议我的
swift代码库我有协议与相关的类型和两个方法.这两种方法都为协议的相关类型定义了不同的通用约束.我想使结构符合协议,但有两种不同的关联类型.
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 这将导致将地址解释为整数并给出完全错误的结果.如果你定义它反之亦然它会崩溃,因为它试图将整数解释为一个地址. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |