非final类不能满足协议要求,因为它在非参数非结果类型中使用"Self"

sak*_*sak 10 swift

我想用一个类方法实现一个协议,该方法将实现类的数组作为参数.例如这样的事情:

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

class MyClass : MyProtocol {
    class func foo(verticies: [MyClass]) -> Int {
        return 42
    }
}
Run Code Online (Sandbox Code Playgroud)

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

协议'MyProtocol'要求'foo()'不能被非最终'MyClass'类满足,因为它在非参数非结果类型中使用'Self'

但是如果我使用MyClass类型的对象而不是数组,这可以很好地工作:

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

class MyClass : MyProtocol {
    class func foo(verticies: MyClass) -> Int {
        return 42
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这不适用于数组类型,并且有正确的方法吗?

mat*_*att 10

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

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