我已经开始编写一本关于Swift中面向协议编程的教科书。当我在操场上写出代码时,我注意到本书中的一个方法使用了关键字“static”。据我所知,静态方法意味着该方法将由类型本身调用,而不是由类型的特定实例调用。另外我的理解是,静态方法不能被覆盖。
由于协议在声明时只是方法签名,我认为使用关键字“static”有点奇怪,因为我们必须在符合协议的情况下实现函数的存根。
为了开始以抽象的方式思考,我想知道协议方法是否意味着在Swift中被覆盖,或者使用关键字“static”只是让它到只有类型本身可以调用方法的地方与调用该方法的实例相比?
protocol YourProtocol {
//property requirements that types that conform to this protocl MUST implement
var gettableProperty: String { get }
var gettableSettableProperty: Int { get set }
//method requirements that types that conform to this protocol MUST implement
func someMethod(parameter1: Double) -> String
static func staticMethod() -> Float
}
答案 0 :(得分:2)
您是正确的static
方法无法覆盖,因为它们始终绑定到一个特定类型,但是,协议中的static
方法声明可以使用class
方法实现。并且可以覆盖class
方法:
protocol YourProtocol {
static func staticMethod() -> Float
}
class A: YourProtocol {
class func staticMethod() -> Float {
return 1.0
}
}
class B: A {
override class func staticMethod() -> Float {
return 2.0
}
}
此外,被覆盖的能力不是核心观点。我认为可以在static
常量或static
变量getter上更好地理解这个概念,从静态库中获取示例:
public protocol FloatingPoint: ... {
public static var pi: Self { get }
}
该协议由所有浮点类型实现,例如Double
和Float
甚至不是类,因此它们不支持继承和覆盖。在声明使用此协议作为类型约束的泛型方法时,可以使用甚至在协议中声明其静态常量的事实:
func toDegrees<T: FloatingPoint>(radians: T) -> T {
// the .pi here is a static var getter
return radians * 180 / T.pi
}