我对通用编程很新,我遇到了Swift 3的问题并且继承了泛型类。我把这一切都剥夺了一个简单的案例,但是我希望有人可以帮助解释我为什么会失败。
使用以下协议和类,一切正常。这是有效的(我的真实代码有很多工作,但工作正常):
protocol P {
associatedtype T
}
class Temp<X> {}
class C1<D:P> {
init(tmp: Temp<D.T>) {}
}
但是,当我按如下方式进行子类化时:
class C2<L:P> : C1<L> {}
我的编译失败了:
<unknown>:0: error: expression type 'Temp<_>' is ambiguous without more context
错误不在特定行上,而是出现在编译器活动日志中的失败。
也许有一些我想念的简单,但我只是看不到它。我的子类与基类具有相同的约束(也就是说,它必须采用协议P),所以在我看来这应该有效。
有什么想法吗?
答案 0 :(得分:2)
我首先说我无法弄清楚为什么你的问题正在发生,但我希望这可以帮助你某种方式
让我们从C1
班开始。
class C1<D: P> {}
通过使用它,一切正常。所以我想确保通用参数可以在C1
和C2
中使用,实际上它可以
class C1<D: P> {
// it compiles
let something: D.T? = nil
// it compiles
func doSomething(using parameter: D.T) {
}
// do not compile
init(_ some: D.T) {
}
}
最后,如果覆盖init
类中的C2
,代码最终会编译。
我认为它实际上可能是一个编译器问题,我会尝试为此提交雷达。我实际上还不知道还有什么可以尝试。