# iOS-Инкубатор. Диспетчеризация в iOS 3 ноября 2022 ## Static Dispatch Value types: ```swift struct Greeter { func hello() { print("Hello!") } } let greeter = Greeter() greeter.hello() // Static Dispatch ``` Struct Extension: ```swift struct Greeter { func hello() { print("Hello!") } } extension Greeter { func hello(name: String) { print("Hello \(name)!") } } let greeter = Greeter() greeter.hello(name: "world") // Static Dispatch ``` Class Extension: ```swift class Greeter { func hello() { print("Hello!") } } extension Greeter { func hello(name: String) { print("Hello \(name)!") } } let greeter = Greeter() greeter.hello(name: "world") // Static Dispatch ``` Class: NSObject Extension (Swift 4+): ```swift class Greeter: NSObject { func hello() { print("Hello!") } } extension Greeter { func hello(name: String) { print("Hello \(name)!") } } let greeter = Greeter() greeter.hello(name: "world") // Static Dispatch ``` ## Table Dispatch ### Virtual Table ```swift class Greeter { func hello() { print("Hello!") } } let greeter = Greeter() greeter.hello() // Virtual Table ``` ```swift class Greeter: NSObject { func hello() { print("Hello!") } } let greeter = Greeter() greeter.hello() // Virtual Table ``` ### Witness Table ```swift protocol GreeterProtocol { func hello(name: String) } class Greeter { func hello() { print("Hello!") } } extension Greeter: GreeterProtocol { func hello(name: String) { print("Hello \(name)!") } } let greeter = Greeter() greeter.hello(name: "Kirill") // Witness Table ``` ## Message Dispatch - Swizzling, как Method Swizzling (метод) так и Isa Swizzling (объект). - KVO (Key-Value Observing) и KVC (Key-Value Coding). - Message Forwarding / NSProxy (Если в иерархии класса не найден вызываемый метод, то нам будет дана возможность обработать вызов и не упасть) ## Протоколы ```swift protocol ChatProvider { func sendMessage() func openChat() } extension ChatProvider { func sendMessage() { print("Message") } } class Messenger: ChatProvider { func sendMessage() {} func openChat() {} } let messenger = Messenger() messenger.sendMessage() // Virtual Table messenger.openChat() // Virtual Table ``` ```swift protocol ChatProvider { func sendMessage() func openChat() } extension ChatProvider { func sendMessage() { print("Message") } } class Messenger: ChatProvider { func openChat() {} } let messenger = Messenger() // [1] messenger.sendMessage() // Static Dispatch messenger.openChat() // Virtual Table ``` ```swift protocol ChatProvider { func sendMessage() func openChat() } extension ChatProvider { func sendMessage() { print("Message") } } class Messenger: ChatProvider { func sendMessage() func openChat() } let messenger: ChatProvider = Messenger() // [2] messenger.sendMessage() // Witness Table messenger.openChat() // Witness Table ```swift @objc protocol ChatProvider { // [3] func sendMessage() func openChat() } class Messenger: NSObject { } extension Messenger: ChatProvider { func sendMessage() {} func openChat() {} } let messenger = Messenger() messenger.sendMessage() // Message Dispatch messenger.openChat() // Message Dispatch ``` ### Модификаторы диспетчиризации - **final** - **staic** - **dynamic** - **@objc** - **final @objc** - **@nonobjc** - **@inline** ### Оптимизация Оптимизация по скорости `Optimize for Speed [-O]` старается использовать @inline Оптимизация по размеру `Optimize for Size [-Osize]` старается не использовать @inline ## Задачки ### 1 Что будет выведено в консоли и почему? ```swift class Greeter: NSObject { func hello() { print("Hello!") } } extension Greeter { //static func goodbye() { // <<-- @objc dynamic func goodbye() print("Goodbye!") } } class ChatGreeter: Greeter { override func hello() { print("Hi!") } override func goodbye() { // <-- x print("Bye-bye!") } } let chatGreeter = ChatGreeter() chatGreeter.hello() chatGreeter.goodbye() ``` extension Greeter { @objc dynamic func goodbye() { print("Goodbye!") } } Ошибка компиляции. ## 2 Что будет выведено в консоли и почему? ```swift protocol TheProtocol { } extension TheProtocol { func method() { print("in TheProtocol") } } struct TheStruct: TheProtocol { func method() { print("in TheStruct") } } let theStruct: TheStruct = TheStruct() let theProtocol: TheProtocol = theStruct theStruct.method() theProtocol.method() ``` in TheStruct in TheProtocol ## 3 ```swift protocol TheProtocol { func method() } extension TheProtocol { func method() { print("in TheProtocol") } } struct TheStruct: TheProtocol { func method() { print("in TheStruct") } } let theStruct = TheStruct() let theProtocol: TheProtocol = theStruct theStruct.method() theProtocol.method() ``` ## 4 Что будет выведено в консоль? ```swift protocol ChatProvider { func sendMessage() } extension ChatProvider { func sendMessage() { print("Message") } } class Messenger: ChatProvider {} class LoudMessenger: Messenger { func sendMessage() { print("MESSAGE!") } } func sendMessageFrom(messenger: ChatProvider) { messenger.sendMessage() } let loudMessenger = LoudMessenger() loudMessenger.sendMessage() sendMessageFrom(messenger: loudMessenger) ``` MESSAGE! Message Про баги: https://github.com/apple/swift/issues/43201 https://github.com/apple/swift/issues/42725
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up