Swift環(huán)境中Load與Initialize的實現(xiàn)

Swift環(huán)境中Load與Initialize的實現(xiàn)

背景

最近在開始一個新的項目預(yù)研,預(yù)研的主要工作一般就是語言選型,需要用到什么開源庫、還有就是項目架構(gòu)的初步搭建,項目中需要用到技術(shù)的攻關(guān)諸如此類的。

在語言選型暫時選定為swift,因為swift相對于Objective-C的優(yōu)勢,就暫且不表了,對于我的吸引,更多的是更加簡潔的語法,更加少的代碼量這兩項就足以讓我這個新手去嘗試的踩一下坑了。

在考慮使用swift的時候,就必須解決swift在Objective-C語言上不支持的一些特性,盡量去抹平這兩個語言技術(shù)上的開發(fā)差距。雖然因為對swift語言不熟悉,但是還是需要盡量避免在正式進(jìn)入業(yè)務(wù)開發(fā)的時候因為碰到一下語言問題而卡殼,還是一個必須提前解決的問題。

在開源庫上,目前iOS開發(fā)上大多數(shù)的開源庫,大多數(shù)都能兼容swift的開發(fā)或者能找好很的用swift實現(xiàn)的替代品。所以更多還是考慮預(yù)研平臺上的差距,比如runtime一些動態(tài)特性是否還能繼續(xù)使用。通過一輪的google,發(fā)現(xiàn)swift在使用runtime上面還是沒有太大問題的。在考慮埋點的時候,需要用到method swizzle,而method swizzle一般是在類加載的時候進(jìn)行操作,而swift環(huán)境中使用load方法時提示:Method 'load()' defines Objective-C class method 'load', which is not permitted by Swift,也就是load方法已經(jīng)不在許可在swift中使用。

這就是在這篇文章的背景。

現(xiàn)狀

目前網(wǎng)上的blog大多數(shù)的解決方案,都是來自一篇博客Handling the Deprecation of initialize(),通過UIApplication來進(jìn)行初始化來實現(xiàn),具體就不在分析了。

這個方案已經(jīng)很大程度上解決了這個問題,作為一個簡潔派的代碼狗來說,這個方式略顯繁瑣,而且也不優(yōu)雅。于是乎,就有了這個個人認(rèn)為比較優(yōu)雅的方式。

實現(xiàn)方式

這個方式有以下幾個特點:

  • 完全特性O(shè)bjective-C中l(wèi)oad和initialize類方法一摸一樣

  • 無論在純swift環(huán)境或者是swift與OC混編環(huán)境都能很好的運(yùn)行

  • 代碼非常簡單

其實是一個非常簡單的方式,但是卻是一個功能和oc環(huán)境一樣的load和initialize方法,原理也很簡單。這個類庫暫且叫SwiftyLoad。

傳送門:SwiftyLoad

定義一個協(xié)議

定義一個教N(yùn)SSwiftyLoadProtocol的協(xié)議,該協(xié)議的目的是在swift環(huán)境中接受load和initialize的回調(diào)。

swift環(huán)境中需要使用load或者initialize方法的類,在extension中實現(xiàn)NSSwiftyLoadProtocol。

需要添加load方法和initialize方法的類添加分類

使用宏為每一個需要添加load方法或者initialize方法的類,添加一個category分類,該分類是調(diào)用swift環(huán)境中extension擴(kuò)展中實現(xiàn)了協(xié)議的swiftyLoad和swiftyInitialize方法的實際實現(xiàn)。

使用

使用SwiftyLoad有兩種情況

純swift環(huán)境
  • 需要使用SwiftyLoad庫的類需要用@objc關(guān)鍵字修飾

  • 在純swift環(huán)境中,在工程中添加任意的swift.m(不叫swift也可以,名字任意)代碼

  • 在swift.m文件中使用SWIFTY_LOAD_INITIALIZE(TestClass)來創(chuàng)建分類

  • 需要TestClass便攜式extension并實現(xiàn)NSSwiftyLoadProtocol協(xié)議即可

Swift與OC混編環(huán)境
  • 步驟與以上大同小異

最后

在github的代碼中,有詳細(xì)的使用例子

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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