小编aeu*_*nks的帖子

Protocol func返回Self

我有一个协议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 Cfinalie 的情况:

final class C : P {
    func copy() -> C  {
        return C()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想继承C,那么什么都行不通.有没有办法解决?

protocols subclassing swift swift-protocols

70
推荐指数
5
解决办法
2万
查看次数

Swift协议和全局函数的返回类型

这是一个问题的后续问题: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)

swift

6
推荐指数
1
解决办法
2142
查看次数

标签 统计

swift ×2

protocols ×1

subclassing ×1

swift-protocols ×1