如果协议扩展中定义了静态方法,如何调用协议上的静态方法?
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.
因此不能直接调用协议的静态方法
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.
因此不能直接调用协议的静态方法