Свойства и методы класса
Ранее уже рассматривались статические свойства и методы, которые являются общими для всего типа. Однако у них есть одна проблема: их нельзя переопределить в производных классах:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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. Либо же мы также можем определить их как свойства и методы класса:
1
2
3
4
5
6
7
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
}
}