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ì)的使用例子