Ранее уже рассматривались статические свойства и методы, которые являются общими для всего типа. Однако у них есть одна проблема: их нельзя переопределить в производных классах:
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 } }