方法調整
在 Swift 中使用方法調配時,你的類/方法必須遵守兩個要求:
- 你的類必須延長
NSObject
- 你想要調配的函式必須具有
dynamic
屬性
有關為什麼需要這樣做的完整說明,請檢視使用 Swift 與 Cocoa 和 Objective-C :
需要動態排程
雖然
@objc
屬性將 Swift API 暴露給 Objective-C 執行時,但它不保證動態排程屬性,方法,下標或初始化程式。 Swift 編譯器仍然可以通過半虛擬化或內聯成員訪問來優化程式碼的效能,從而繞過 Objective-C 執行時。使用dynamic
修飾符標記成員宣告時,始終會動態排程對該成員的訪問。因為使用 Objective-C 執行時排程使用dynamic
修飾符標記的宣告,所以使用@objc
屬性隱式標記它們。要求動態排程很少是必要的。但是,當你知道在執行時替換 API 的實現時,必須使用
dynamic
修飾符。例如,你可以在 Objective-C 執行時使用method_exchangeImplementations
函式在應用程式執行時交換方法的實現。如果 Swift 編譯器內聯該方法的實現或對其進行虛擬化訪問,則不會使用新的實現。