Как получить доступ к статическим переменным в методах, используя расширения протокола Swift, подобные «абстрактному классу»

Я пытался создать абстрактное поведение, подобное суперклассу, в Swift, используя протоколы и расширения, предложенные здесь: Абстрактные классы на языке Swift Но я не могу понять, как писать методы, использующие статические (классовые) переменные. Например, если я хочу получить периметр абстрактного класса формы:

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 не хочет, чтобы я использовал static var numSides в методе calcPerimeter. Я знаю, что если бы я сделал это переменной экземпляра, код запустился бы, но это не похоже на правильный путь. Как лучше всего это сделать?


person c_booth    schedule 13.01.2016    source источник


Ответы (1)


Вы должны использовать numSide как статическую переменную, а не экземпляр. Вы не можете вызывать Shape.numSides, но можете использовать ключевое слово Self, которое ссылается на конкретный класс. Попробуй это:

Self.numSides
person Greg    schedule 13.01.2016
comment
Не себя, но Я. Спасибо! - person c_booth; 13.01.2016
comment
Да, я в моем ответе в верхнем регистре. - person Greg; 13.01.2016