[英]Swift protocol extension implementing another protocol with shared associated type
考虑以下:
protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
func hi() -> A
}
extension FooBar {
func hello() -> A {
return hi()
}
}
class FooBarClass: FooBar {
typealias A = String
func hi() -> String {
return "hello world"
}
}
这段代码编译。 但是如果我注释掉关联类型类型typealias A = String
显式定义,那么由于某种原因,swiftc无法推断出类型。
我感觉这与两个共享相同关联类型但没有直接断言的协议有关 ,例如,类型参数化(可能关联类型不够强大/不够成熟?),这使得类型推断模糊不清。
我不确定这是否是该语言的错误/不成熟,或者可能,我错过了协议扩展中的一些细微差别,这恰恰导致了这种行为。
有人可以对此有所了解吗?
看看这个例子
protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
typealias B
func hi() -> B
}
extension FooBar {
func hello() -> B {
return hi()
}
}
class FooBarClass: FooBar {
//typealias A = String
func hi() -> String {
return "hello world"
}
}
与泛型
class FooBarClass<T>: FooBar {
var t: T?
func hi() -> T? {
return t
}
}
let fbc: FooBarClass<Int> = FooBarClass()
fbc.t = 10
fbc.hello() // 10
fbc.hi() // 10
为了符合所述协议,需要为协议中的关联类型提供显式值。 这可以通过对类型进行硬编码来完成,就像你使用了typealias A = String
,或者使用你提到的参数化类型,如下所示:
class FooBarClass<T>: FooBar {
typealias A = T
...
}
Swift不会从协议的实现方法推断出您的关联类型,因为多种方法可能存在歧义,类型不匹配。 这就是必须在实现类中显式解析typealias的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.