如果协议扩展中定义了静态方法,如何调用协议上的静态方法?

How to call static methods on a protocol if they are defined in a protocol extension?

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() 的成员)。如果静态方法是在协议扩展中定义的,你能直接在协议上调用静态方法吗?

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

这样想,你不可能有

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

编译时出现错误 "Protocol methods may not have bodies"。

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

苹果doc

Protocols do not actually implement any functionality themselves. Nonetheless, any protocol you create will become a fully-fledged type for use in your code.

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