【发布时间】:2014-10-27 23:59:27
【问题描述】:
我有一个返回对象副本的协议 P:
protocol P {
func copy() -> Self
}
还有一个实现 P 的 C 类:
class C : P {
func copy() -> Self {
return C()
}
}
但是,无论我将返回值设置为Self,我都会收到以下错误:
无法将“C”类型的返回表达式转换为“Self”类型的返回
我也尝试返回C。
class C : P {
func copy() -> C {
return C()
}
}
这导致了以下错误:
非最终类 'C' 中的方法 'copy()' 必须返回
Self以符合 到协议'P'
除了我在 class C 前加上 final 的情况外,没有任何效果,即:
final class C : P {
func copy() -> C {
return C()
}
}
但是,如果我想将 C 子类化,那么什么都行不通。有没有办法解决这个问题?
【问题讨论】:
-
“没有任何效果”是什么意思?
-
编译器在将 C 或 Self 作为返回值时会报错,除非
class是final class -
好的,我已经重现了错误,但是在提问时,您需要包含返回的实际错误。不仅仅是“它给出错误”或“它不起作用”。
-
编译器在这里的错误是完全正确的,顺便说一句。我只是在想你是否能得到你想做的事情。
-
但您可以致电
[[[self class] alloc] init]。所以我想问题是有没有一种类型安全的方法来调用当前类并调用 init 方法?
标签: swift protocols subclassing swift-protocols