2017-01-16 41 views
0

在我的應用程序中,我有很多樣板代碼,只要在某個控制器中存在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,他們分享這是一個默認實現的(可能)放置在一個可分頁協議擴展?

回答

2

您可以使用協議擴展實現您正在尋找的內容。該擴展將適用於防止實現協議的對象實際上是UIViewController。

protocol something { 
    func method() 
} 
extension something where Self: UIViewController { 
    func method() { 
     //Default implementation 
    } 
} 
相關問題