在我的應用程序中,我有很多樣板代碼,只要在某個控制器中存在UITableView,就必須寫入代碼。爲了消除它,我創建了一個BaseTableViewController,它實現了一些重複使用的UITableDataSource
操作,如tableView(_:numberOfRowsInSection:)
和tableView(_:cellForRowAt:)
。在tableView(_:numberOfRowsInSection:)
中,我的BaseTableViewController從另一個方法(我們稱之爲rowCount(inSection:)
)中檢索一個節中的實際行數,並使用它執行一些計算,然後將結果返回給委託調用者。子類BaseTableViewController的每個類都必須覆蓋rowCount(inSection:)
方法,並在給定部分返回適當的行數(BaseTableViewController本身在默認實現中返回0)。爲被覆蓋的UIViewController方法提供一個默認的實現,但只有當控制器符合協議時
現在,我的一些表格視圖控制器支持顯示記錄的分頁 - 當用戶將表格視圖滾動到最後一行時,從網絡中檢索下一批行。試圖讓事情變得更加協議爲本,我創建了分頁控制器的協議:
protocol Pageable: class {
associatedtype DataType
var pages: [[DataType]] { get set } // Each page is an array of elements, hence the table in a table
func loadNextPage()
}
如果控制器爲Pageable
,在rowCount(inSection:)
方法總是看起來是這樣的:
override func rowCount(inSection: Int) -> Int {
return self.pages[section].count
}
這是乏味的,因爲每個也是Pageable的BaseTableViewController後代都必須具有此確切的實現,這違反了DRY。
我不能在Pageable
的協議擴展中添加默認實現,因爲控制器已經有自己的實現繼承自BaseTableViewController。我可以創建一個PageableTableViewController(BaseTableViewController的子類),它提供自己的覆蓋實現rowCount(inSection:)
,但這不是非常面向協議的。我也嘗試將rowCount(inSection:)
方法移動到一個協議上,但是如果我使BaseTableViewController的所有後代與協議擴展一致,則擴展Pageable
來實現該方法將不起作用。
我將如何建立一個機制,其中的BaseTableViewController
所有子類將能夠覆蓋rowCount(inSection:)
方法,但是當他們Pageable
,他們分享這是一個默認實現的(可能)放置在一個可分頁協議擴展?