gpt4 book ai didi

swift - 协议(protocol)方法是否意味着在 Swift 中被覆盖?

转载 作者:行者123 更新时间:2023-11-28 11:58:39 24 4
gpt4 key购买 nike

我已经开始研究一本关于 Swift 中面向协议(protocol)编程的教科书。当我在 Playground 上写代码时,我注意到书中的一种方法使用了关键字“static”。据我了解,静态方法意味着该方法将由类型本身调用,而不是由该类型的特定实例调用。另外我的理解是,静态方法不能被覆盖。

由于协议(protocol)在声明时只是方法签名,所以我认为看到使用关键字“static”有点奇怪,因为无论如何,当我们遵守协议(protocol)时,我们将不得不实现函数的 stub 。

开始以抽象的方式思考,我想知道协议(protocol)方法是否意味着在 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

}

最佳答案

static 方法不能被覆盖是正确的,因为它们总是绑定(bind)到一个特定类型,但是,协议(protocol)中的 static 方法声明可以使用方法。并且 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 }
}

此协议(protocol)由所有浮点类型实现,例如DoubleFloat 甚至都不是类,因此它们不支持继承和覆盖。在声明将此协议(protocol)用作类型约束的泛型方法时,甚至可以在协议(protocol)中声明它们的静态常量这一事实:

func toDegrees<T: FloatingPoint>(radians: T) -> T {
// the .pi here is a static var getter
return radians * 180 / T.pi
}

关于swift - 协议(protocol)方法是否意味着在 Swift 中被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com