Свойства и методы класса

Последнее обновление: 02.01.2018

Ранее уже рассматривались статические свойства и методы, которые являются общими для всего типа. Однако у них есть одна проблема: их нельзя переопределить в производных классах:

class Exchange{
    static var usd = 59.0
    static func convert(sum: Double) -> Double{
        return sum / usd
    }
}
        
class BankExchange : Exchange{
            
    // переопределить нельзя
    /*override static var usd = 59.0
    override static func convert(sum: Double) -> Double{
        return sum / usd
    }*/
}

Например, в данном случае класс Exchange представляет обменник, который с помощью метода convert обменивает средства одной валюты на usd. Но, к примеру, в банке действует обменник, в котором будет отличаться курс доллара и который будет при обмене вычитать дополнительные проценты за обмен. Однако переопределить функционал класса Exchange мы не сможем, так как и свойство и метод являются статическими.

Для решения этой проблемы в классе могут быть определены свойства и методы класса (class properties/class methods). Они похожи на статические, то есть относятся ко всему классу в целом, а не к отдельным его объектам. Для определения свойств и методов класса применяется ключевое слово class:

class Exchange{
    class var usd : Double { return 59.0 }
    class func convert(sum: Double) -> Double{
        return sum / usd
    }
}
        
class BankExchange : Exchange{
            
    override static var usd : Double{ return 59.1 }
    override static func convert(sum: Double) -> Double{
        return sum / usd - sum / usd * 0.1
    }
}
        
print(Exchange.convert(sum: 20000))         // 338.98
print(BankExchange.convert(sum: 20000))     // 304.56

К таким свойствам и методам обращение идет по имени класса, как и в случае со статическими.

При переопределении свойств класса следует учитывать, что свойства класса должны быть вычисляемыми, как в данном случае.

Также стоит учитывать, что при переопределении мы можем определить свойства и методы как статические, как в случае выше, тогда они также будут недоступны для переопрееления для классов-наследников от BankExchange. Либо же мы также можем определить их как свойства и методы класса:

class BankExchange : Exchange{
    
    override class var usd : Double{ return 59.1 }
    override class func convert(sum: Double) -> Double{
        return sum / usd - sum / usd * 0.1
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850