方法調整

在 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 編譯器內聯該方法的實現或對其進行虛擬化訪問,則不會使用新的實現

連結

Objective-C 執行時參考

方法在 NSHipster 上晃盪