非最终类不能满足协议要求,因为它使用了“自我”。在非参数,非结果类型中

时间:2016-10-26 18:56:18

标签: swift

我想用一个类方法实现一个协议,该方法将实现类的数组作为参数。比如像这样:

protocol MyProtocol {
    static func foo(verticies: [Self]) -> Int
}

class MyClass : MyProtocol {
    class func foo(verticies: [MyClass]) -> Int {
        return 42
    }
}

当我尝试这个时,我收到以下错误:

  

协议' MyProtocol'要求' foo()'不能被非决赛的MyClass'因为它使用' Self'在非参数非结果类型

但如果我使用MyClass类型的对象而不是数组,那么这种方法很有效:

protocol MyProtocol {
    static func foo(verticies: Self) -> Int
}

class MyClass : MyProtocol {
    class func foo(verticies: MyClass) -> Int {
        return 42
    }
}

为什么这不适用于数组类型,是否有正确的方法来执行此操作?

1 个答案:

答案 0 :(得分:4)

问题与如果MyClass有一个子类会发生什么的不确定性有关(因为泛型,比如Array,不是类,不会神奇地做多态)。只需执行错误消息所说的内容,一切都会好起来:

protocol MyProtocol {
    static func foo(verticies:[Self]) -> Int
}
final class MyClass : MyProtocol {
    class func foo(verticies:[MyClass]) -> Int {
        return 1
    }
}