如何使用 Swift 的 'abstract class' 类协议扩展访问方法中的静态变量

How to access static variables in methods using Swift's 'abstract class'-like protocol extensions

我一直在尝试使用此处建议的协议和扩展在 Swift 中实现抽象的超级class 类行为:Abstract classes in Swift Language 但我不知道如何编写使用静态 (class) 变量的方法。例如,如果我想获得一个抽象形状的周长class:

protocol Shape {
    static var numSides: Int {get}
    var sideLength: Double {get}
}
class Triangle: Shape {
    static var numSides: Int = 3
    var sideLength: Double
    init (sideLength: Double) { self.sideLength = sideLength }
}
class Square: Shape {
    static var numSides: Int = 4
    var sideLength: Double
    init (sideLength: Double) { self.sideLength = sideLength }
}
extension Shape {
    func calcPerimeter() -> Double {
    return sideLength * Double(numSides)
    }
}

Swift 不希望我在 calcPerimeter 方法中使用静态变量 numSides。我知道如果我将它设为实例变量,代码会 运行,但这似乎不是正确的方法。最好的方法是什么?

您应该将 numSide 用作静态变量而不是实例变量。 你不能调用 Shape.numSides 但你可以使用 Self 关键字来引用具体的 class。 试试这个:

Self.numSides