swift 方法替換swizzing

最近忽然發(fā)現(xiàn)了一個(gè)swift的之前發(fā)布的feature,很有意思,之后開發(fā)可能用得到,記錄一下。

@_dynamicReplacement(for:)

動(dòng)態(tài)方法替換,需要swift版本5.1以上,這東西貌似是為了實(shí)現(xiàn)Xcode中swiftUI的preview而加進(jìn)來的,不過既然加進(jìn)來了,就肯定可以用來做其他的,舉例如下。

class Person {
    dynamic func say() {
        print("hi")
    }
}

extension Person {
    @_dynamicReplacement(for: say)
    func sayA() {
        print("A1")
        say()
        print("A2")
    }
}

Person().say()
// 輸出 A1   hi   A2

注意事項(xiàng):

  1. 除非增加-enable-implicit-dynamic的編譯標(biāo)志(building setting -> swift compiler - Custom Flags -> Other Swift Flags),否則,被替換的方法需要被 dynamic 標(biāo)記,不然無法通過編譯
  2. 在使用OC的運(yùn)行時(shí)方法替換時(shí),想要執(zhí)行原方法,應(yīng)該調(diào)用sayA,但在使用@_dynamicReplacement時(shí),直接調(diào)用say就可以了

連環(huán)替換的場(chǎng)景

上面的情況看起來沒有什么特殊的,我們看一下連環(huán)替換的場(chǎng)景

class Person {
    dynamic func say() {
        print("hi")
    }
}

extension Person {
    @_dynamicReplacement(for: say)
    func sayA() {
        print("A1")
        say()
        print("A2")
    }
}

extension Person {
    @_dynamicReplacement(for: say)
    func sayB() {
        print("B1")
        say()
        print("B2")
    }
}

Person().say()

如果是OC的運(yùn)行時(shí)實(shí)現(xiàn)方法替換,不難想象輸出會(huì)是:
B1 - A1 - hi - A2 - B2
但在這里,會(huì)輸出:
B1 - hi - B2
后聲明的方法替換才會(huì)生效,但假如我們添加-Xfrontend-enable-dynamic-replacement-chaining這兩個(gè)編譯標(biāo)志后,就可以得到:
B1 - A1 - hi - A2 - B2

我這里只記錄一下,具體的原理和分析可以看下下面的參考鏈接。

參考

  1. https://www.guardsquare.com/blog/swift-native-method-swizzling
  2. https://www.desgard.com/ios/swift/2019/07/27/swift-method-swizzling.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 整理了一些個(gè)人認(rèn)為比較經(jīng)典,含金量高的博客,本文分兩部分,個(gè)人及團(tuán)隊(duì)開發(fā)者。 個(gè)人開發(fā)者博客匯總 1.OneV's...
    wyc520閱讀 3,634評(píng)論 2 48
  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,192評(píng)論 1 180
  • 背景 靜態(tài)分派(static dispatch)和動(dòng)態(tài)分派(dynamic dispatch)是用來處理編程語言語...
    sea_biscute閱讀 8,944評(píng)論 6 30
  • 靜態(tài)派發(fā) 值類型對(duì)象的函數(shù)的調(diào)用方式是靜態(tài)調(diào)用,即直接地址調(diào)用,調(diào)用函數(shù)指針,這個(gè)函數(shù)指針在編譯、鏈接完成之后就已...
    黑白森林無間道閱讀 1,240評(píng)論 1 4
  • 一、UI視圖相關(guān) 1、UITableView數(shù)據(jù)源同步 (1)并發(fā)訪問,數(shù)據(jù)拷貝例如:在列表刪除一個(gè)cell數(shù)據(jù),...
    joeal閱讀 961評(píng)論 0 0

友情鏈接更多精彩內(nèi)容