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

Swift 如果在协议扩展中定义了静态方法,那么如何调用协议上的静态方法?,swift,protocols,swift2,protocol-extension,Swift,Protocols,Swift2,Protocol Extension,Xcode自动正确地完成了Car.foo(),因此我要问的是,它是否是一个未编译的bug(表示它没有名为foo()的成员)。如果在协议扩展中定义了静态方法,是否可以直接在协议上调用它们 不,错误消息不好,但它告诉您正确的事情 这样想吧,你不可能 protocol Car { static func foo() } struct Truck : Car { } extension Car { static func foo() { print("bar")

Xcode自动正确地完成了
Car.foo()
,因此我要问的是,它是否是一个未编译的bug(表示它没有名为foo()的成员)。如果在协议扩展中定义了静态方法,是否可以直接在协议上调用它们

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

这样想吧,你不可能

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
编译时会出现错误“协议方法可能没有实体”

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

Apple

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


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

Car不是一个对象,所以您不能向它发送任何消息。这对我来说就像一个bug。由于默认实现将实际功能直接绑定到协议,因此它应该可以在协议本身上调用。@hennes“默认实现将实际功能直接绑定到协议”不是正确的语句。默认实现将功能绑定到符合协议的类和结构。有些协议没有实现。似乎有一个bug,Xcode实际上建议自动完成,如果不可能,它不应该这样做。在Swift 2中,协议扩展实际上可以添加默认实现。@hennes是的,他们将默认实现添加到类和结构中……而不是协议。协议没有实现。“不是这样说的,还是我弄错了?”海恩斯说。新的协议扩展添加到符合该协议的类或结构中,但该协议仍然只是一个协议。协议没有实现,所以关键是默认实现被添加到每个一致性类/结构中,而不是协议。我明白你的意思。不过,我觉得这有点奇怪。他们可以通过简单的破解来实现。这是我的相关答案。
protocol Car {
    static func foo() {
        print("bar")
    }
}