Кроме свойств, которые относятся к отдельным экземплярам класса, мы можем определять свойства, которые относятся ко всему типу - свойства типа (type properties). В других языках программирования есть аналогичная конструкция в виде статических переменных.
Статические свойства предваряются ключевым словом static:
class Greeting { static let english = "hello" static let french = "salut" static let german = "halo" } print(Greeting.english) // hello
В данном случае константы english, french и german относятся ко всему классу Greeting в целом, поэтому обращение к ним производится по имени класса.
Другой пример: допустим, класс вклада предусматривает конвертацию суммы вклада в доллары. Для хранения ставки доллара по отношению к текущей валюте мы можем определить свойства типа, так как курс доллара не зависит от конкретного вклада:
class Account{ var capital: Double var rate: Double static var usdRate: Double = 69 init(capital: Double, rate: Double){ self.capital = capital self.rate = rate } func convert() -> Double{ return capital / Account.usdRate } }
Важно, что в самом классе мы не можем обратиться к свойству типа просто по имени свойства или через ключевое слово self
. Для обращения к свойству
типа требуется писать полное название типа: Account.usdRate
.
Таким образом, свойство usdRate
будет общим для всех объектов Account.
По названию типа мы в дальнейшем в программе сможем получить значение этого свойства или изменить его:
var myAcc: Account = Account(capital: 1000, rate: 0.1) var capitalInUsd = myAcc.convert() // 14.4927 Account.usdRate = 65 capitalInUsd = myAcc.convert() // 15.3846
Кроме свойств типа Swift позволяет определять статические методы или метода типы (type methods). Это такие методы, которые относятся ко всему типу, а не к отдельному экземпляру. Например, определим класс обменника валюты:
class Exchange{ static var rate = 58.9 // текущий курс доллара static func operate(sum: Double) -> Double{ // обмен нац. валюты на доллары return sum / rate } } print(Exchange.operate(sum: 20000)) Exchange.rate = 58.5 // изменяем обменный курс print(Exchange.operate(sum: 15000)) print(Exchange.operate(sum: 56000))
Здесь опять же определено свойство типа - константа rate. Поскольку число rate не зависит от экземпляра класса Exchange, оно универсально, так как устанавливается центробанком. И поэтому мы вполне можем сделать это свойство свойством типа.
И кроме того здесь определен метод operate()
- метод обмена валюты, который является статическим.
Его логика и действие в принципе тоже не зависит от конкретных экземпляров класса Exchange, поэтому он определен с ключевым словом static. В дальнейшем обращение к этим методам будет идти опять же
через имя класса:
var z = Exchange.operate(sum: 20000)