我有一个协议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,那么什么都行不通.有没有办法解决?
这是一个问题的后续问题:Protocol func返回Self.协议如下:
protocol Copyable {
init(copy: Self)
func copy() -> Self
}
Run Code Online (Sandbox Code Playgroud)
以下工作正常,但copy()每个实现的功能完全相同,即
func copy() -> Self {
return self.dynamicType(copy: self)
}
Run Code Online (Sandbox Code Playgroud)
根据这个http://nshipster.com/swift-default-protocol-implementations/我尝试了一个全局函数
func copy<T : Copyable>(makeCopy: T) -> T {
return makeCopy.dynamicType(copy: makeCopy)
}
Run Code Online (Sandbox Code Playgroud)
但是,当它在实现以下协议的类中调用时
protocol Mutatable : Copyable {
func mutated() -> Self
}
class C : Mutatable {
var a = 0
required init(_ a: Int) {
self.a = a
}
required init(copy: C) {
a = copy.a
}
func mutated() …Run Code Online (Sandbox Code Playgroud)