我有一个协议P,它返回一个对象的副本:
protocol P {
func copy() -> Self
}
Run Code Online (Sandbox Code Playgroud)
以及实现P的C类:
class C : P {
func copy() -> Self {
return C()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我是否输入返回值,因为Self我得到以下错误:
无法将类型为"C"的返回表达式转换为返回类型"Self"
我也试过回来了C.
class C : P {
func copy() -> C {
return C()
}
}
Run Code Online (Sandbox Code Playgroud)
这导致以下错误:
非终结类'C'中的方法'copy()'必须返回
Self以符合协议'P'
没有什么可行的,除了我前缀class C为finalie 的情况:
final class C : P {
func copy() -> C {
return C()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想继承C,那么什么都行不通.有没有办法解决?
错误:协议'协议'要求'实例'不能被非最终类('Class')满足,因为它在非参数非结果类型位置使用'Self'
protocol Protocol {
var instance: Self {get}
}
class Class: Protocol {
var instance: Class {return Subclass()}
}
class Subclass: Class {}
Run Code Online (Sandbox Code Playgroud)
以下是我在C#中表达我想要的内容.(据我所知,C#没有办法强制通用参数"Self"实际上是我们从Swift中知道的Self,但它的功能很好,因为文档可以让我做正确的事.)
interface Protocol<Self> where Self: Protocol<Self> {
Self instance {get;}
}
class Class: Protocol<Class> {
public Class instance {get {return new Subclass();}}
}
class Subclass: Class {}
Run Code Online (Sandbox Code Playgroud)
...在未来版本的Swift中看起来如何:
protocol Protocol {
typealias FinalSelf: Protocol where FinalSelf.FinalSelf == FinalSelf
var instance: FinalSelf {get}
}
class Class: Protocol {
var instance: Class {return Subclass()}
}
class Subclass: Class {} …Run Code Online (Sandbox Code Playgroud)