关于“幽灵架构”的补充说明5:改造控制器
Swift中的泛型有非常多的用處,除了我在之前介紹的方法中作為占位符之外,還可以被用在協議中,構成一個泛型協議,那么遵守這個泛型協議的成員就會變成泛型成員。還用我們之前的事件節日提醒Demo來展示,在之前的版本中我們使用了一個TableView來展示數據,現在如果有新的需求,需要在CollectonView中做類似的排列,并且針對數據源提供日期的篩選功能,面對相似的功能需求顯然你不想寫兩份代碼,那么此時最好的辦法就是提煉出一個協議來,并且在協議擴展中聲明一份默認的實現。
讓我們來實現第一步:分析需求,提煉協議的組成,在上面的情景中,我們想要一個日期的篩選,所以需要定義一個方法,而篩選是針對數據源的,也就是我們之前的Demo中使用的數組dataList
第二步:定義這個協議,格式如下:
第三步,在協議擴展中聲明默認實現,這個默認實現需要是符合絕大多數情況的實現,這樣可以我們在遵守協議的時候可以免費獲得這個實現,避免多余的代碼,注意這一步不是必須的,但是確實可以顯著地提升代碼的復用:
extension FestivalsAndEventsTool{func search(date:String) -> [DateViewModel]{return dataList.filter{$0.date == date}} }現在回到TableViewController的子類中,只需要遵守協議,就可以獲得數據篩選的方法:
class ShowedTableViewController: UITableViewController, FestivalsAndEventsTool如果還需要在一個CollectionViewController展示事件和節日的話,只需讓CollectionViewController也遵守FestivalsAndEventsTool即可,然后在代碼的合適位置調用search方法。
下面來聊聊泛型控制器,我們的數組源是異構的,因為數組成員是協議類型,如果你希望協議的數據源依舊保持多樣性,但是每個控制器的數據源是同構的,那么可以使用associatedtype 關鍵字聲明一個泛型協議:
使用associatedtype聲明的Model也是一個占位符,你可以給這個占位符加一些約束,比如上例中我們需要Model必須遵守DateViewModel協議。在遵守者的代碼中不用顯示地聲明Model的類型,編譯器會根據每一個Model實際傳入的類型確定Model的實際類型,如果你把協議聲明成了上面的格式,那么之前的TableViewController會報錯,因為我們的dataList是[DateViewModel]類型的,如果你把dataList修改成[Event]或者[Festival]之后,編譯通過了。泛型協議保障了我們的數據安全和一致性。
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的关于“幽灵架构”的补充说明5:改造控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux服务器重启init 6和reb
- 下一篇: Oracle发送邮件存储过程