12
protocol Car {
    static func foo() 
}

struct Truck : Car {

}

extension Car {
    static func foo() {
        print("bar")
    }
}

Car.foo() // Does not work  
// Error: Car does not have a member named foo

Truck.foo() // Works

Xcode 自动完成Car.foo()正确,所以我要问的是它是否是一个无法编译的错误(说它没有名为 foo() 的成员)。如果它们是在协议扩展中定义的,您可以直接在协议上调用静态方法吗?

4

2 回答 2

9

苹果文档

协议本身实际上并不实现任何功能。尽管如此,您创建的任何协议都将成为在您的代码中使用的成熟类型。

因此,不能直接调用协议的静态方法。

于 2015-08-14T09:44:59.077 回答
1

不,错误消息不好,但它告诉你正确的事情。

这样想,你不能

protocol Car {
    static func foo() {
        print("bar")
    }
}

编译时出现错误“协议方法可能没有主体”。

协议扩展不会为不存在的协议添加功能。

于 2015-08-14T09:35:00.620 回答