Метод
Суть
Метод — функция, привязанная к типу. У неё есть неявный self, и она работает с состоянием экземпляра или типа. В Swift методы есть не только у классов, но и у struct, enum, actor и даже у протоколов через extension.
Виды методов в Swift
- Методы экземпляра — вызываются на объекте/значении:
user.rename(...). mutating— дляstruct/enum: метод меняетself; наlet-значении вызвать нельзя.- Методы типа:
static func— нельзя переопределить;class func— можно в подклассе. Часто служат фабриками (Date.now,URL(string:)— это инициализаторы,UIColor.systemBlue— свойство типа). - Инициализаторы и
deinit— особые методы. - Методы в протоколах и расширениях — поведение по умолчанию, не требующее наследования.
struct Counter {
private(set) var value = 0
mutating func increment() { value += 1 } // метод меняет value type
static func zero() -> Counter { Counter() } // метод типа (фабрика)
}
class Shape {
class func make() -> Shape { Shape() } // class func можно override
func area() -> Double { 0 } // vtable dispatch
final func describe() -> String { "area \(area())" } // static dispatch
}
final class Circle: Shape {
var r = 1.0
override func area() -> Double { .pi * r * r }
}
var c = Counter.zero()
c.increment()
print(c.value) // 1
print(Circle().describe()) // area 3.141592653589793
Диспетчеризация — что спросят у middle
- Static —
struct,enum,final,private, методы вextension: адрес известен на этапе компиляции, самый быстрый вариант, возможен инлайн. - Vtable — обычные методы классов: поиск в таблице виртуальных методов.
- Witness table — вызов через
any Protocol/ generic. - Message —
@objc dynamic:objc_msgSend, поиск по селектору в рантайме; нужен для KVO и method swizzling.
Метод, объявленный в extension класса, диспетчеризуется статически и не переопределяется — классическая ловушка на собеседовании.
Инкапсуляция
Методы — публичный интерфейс к приватному состоянию: private(set) var value плюс increment() гарантируют, что счётчик меняется только по правилам типа.