Reputation: 2225
I've been trying to make abstract superclass-like behaviour in Swift using the protocols and extensions suggested here: Abstract classes in Swift Language But I can't figure out how to write methods that make use of static (class) variables. For example, if I want to get the perimeter of an abstract shape 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 doesn't want me to use static var numSides in the calcPerimeter method. I know that if I made it an instance variable the code would run, but this doesn't seem like the right way to go. What is the best way to do this?
Upvotes: 2
Views: 865
Reputation: 25459
You should use numSide as a static variable not instance one.
You cannot call Shape.numSides but you can use Self
keyword which reference to the concrete class.
Try this:
Self.numSides
Upvotes: 2