Статические свойства и методы
Статические свойства
Кроме свойств, которые относятся к отдельным экземплярам класса, мы можем определять свойства, которые относятся ко всему типу - свойства типа (type properties). В других языках программирования есть аналогичная конструкция в виде статических переменных.
Статические свойства предваряются ключевым словом static:
1
2
3
4
5
6
7
class Greeting {
static let english = "hello"
static let french = "salut"
static let german = "halo"
}
print(Greeting.english) // hello
В данном случае константы english, french и german относятся ко всему классу Greeting в целом, поэтому обращение к ним производится по имени класса.
Другой пример: допустим, класс вклада предусматривает конвертацию суммы вклада в доллары. Для хранения ставки доллара по отношению к текущей валюте мы можем определить свойства типа, так как курс доллара не зависит от конкретного вклада:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.
По названию типа мы в дальнейшем в программе сможем получить значение этого свойства или изменить его:
1
2
3
4
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). Это такие методы, которые относятся ко всему типу, а не к отдельному экземпляру. Например, определим класс обменника валюты:
1
2
3
4
5
6
7
8
9
10
11
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. В дальнейшем обращение к этим методам будет идти опять же через имя класса:
1
var z = Exchange.operate(sum: 20000)