swift - 如何使用 Swift 的类似 'abstract class' 的协议(protocol)扩展来访问方法中的静态变量

标签 swift polymorphism abstract-class swift-extensions swift-protocols

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

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 方法中使用 static var numSides。我知道如果我将其设为实例变量,代码就会运行,但这似乎不是正确的方法。最好的方法是什么?

最佳答案

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

Self.numSides

关于swift - 如何使用 Swift 的类似 'abstract class' 的协议(protocol)扩展来访问方法中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34761864/

相关文章:

ios - 无法在 Swift 3 中以编程方式注册字体

java - iOS 中的事件总线等效项

haskell - 类型家族多态性

c++ - 向下转型 C++ 对象

grails - 在抽象类中建立双向关系

ios - 从 UIView 调用共享表

swift - 为什么具有透明背景的 NSImage 得到的 RGB 值为 (0,0,0)?

c++ - 多态实例返回多态实例

java - 如何将此父类(super class)更改为抽象类而不出现实例化异常?

java - 关于Java中的抽象类和Hibernate注解