文中引用到的:
SnapKit
Alamofire
Bees
鏈?zhǔn)秸Z法在開發(fā)很常見猫十。iOS上的許多開源庫都使用了鏈?zhǔn)秸Z法。比如說SnapKit和Alamofire等呆盖。
像以上SnapKit的這種情況拖云,鏈?zhǔn)秸{(diào)用為了靈活的添加各種約束屬性。每次調(diào)用后都是返回ConstraintMakerExtendable的實例应又。
但是這樣就產(chǎn)生了一個問題:沒有辦法在編譯時期檢查被連起來的成員結(jié)構(gòu)V嫦睢!
像以上的情況實際上是不能產(chǎn)生正確的約束株扛,但是在編譯期間編譯器沒有辦法給出提示尤筐,因為并沒有語法錯誤汇荐。
那么如解決這個問題呢?
在Swift上可以利用泛型和協(xié)議拓展
舉個例子
比如動物之間只有同樣的種類才可以互相喜歡盆繁。那先定義一個函數(shù)表示喜歡這個行為掀淘。在定義兩個不同的動物類
好,我們來試一下
嗯油昂,看起來是正常工作了革娄。Dog和Dog可以like,Dog和Cat不可以冕碟!因為like函數(shù)里的left與right兩個參數(shù)類型必須要相同拦惋。不同的話,編譯器就會提示錯誤了鸣哀!
但是好像哪里不對凹芗伞!這和鏈?zhǔn)秸{(diào)用有個屁關(guān)系拔页摹叹放!
別著急。
然后修改下like函數(shù)。
T必須為Animal類型破加,這樣可以使like可以使用聲明在Animal協(xié)議中的方法屬性等俱恶。。范舀。
然后拓展Animal協(xié)議
當(dāng)然這個時候Dog類和Cat類都要遵循Animal協(xié)議
來試一下
嗯合是!鏈?zhǔn)秸{(diào)用可以用了。
這樣子也可以锭环!前面的兩個是不對的cat和dog是不能like聪全。但是編譯時也沒有報錯。因為只要鏈?zhǔn)阶詈蟮哪莻€對象類型相同就可以了辅辩!并沒有解決問題澳牙瘛!
其實我們已經(jīng)快要完成了只要給動物類加個泛型用來記錄左邊已經(jīng)鏈起來的類型就可以了玫锋!
這就是最后的版本了蛾茉!
試一下正確的情況
錯誤的情況
不管鏈的多長,只要連起來的所有對象中有一對類型不匹配撩鹿,就不能通過編譯谦炬!
但是以上的例子中只保留了鏈起來的最后一個對象!實際的應(yīng)用中节沦,應(yīng)該是要保留連起來的所有對象的吧寺。不然就沒有意義了窜管。
說了這么多!有什么實際的意義呢稚机?
回到開頭的SnapKit幕帆,使用鏈?zhǔn)秸{(diào)用創(chuàng)建約束時,就可以使用以上的方法來降低程序的錯誤率赖条。因為錯誤的寫法不能通過編譯笆!雖然減少了一點點靈活性纬乍,但是安全性提高很多碱茁。
我在自己的自動布局庫里就用了這種方法:點這里Bees
Bees
top和left是不能創(chuàng)建約束的,所以在編譯時就提出了錯誤仿贬!