如何使用 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
我一直在尝试使用此处建议的协议和扩展在 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