2016-02-20 105 views
0

我試圖使用UITableViewCell以及UICollectionViewCell,除了一些細節外,它們幾乎具有完全相同的功能。我想創建一個這兩個可以繼承的超類,但不知道如何去做。我通過使用UIViewController超類來完成我的UITableViewControllerUICollectionViewController。每個子類都是UIViewController類型,它具有適當的委託/數據源方法。但是,UITableViewCellUICollectionViewCell沒有數據源/委託方法。我怎樣才能做到這一點? 謝謝!繼承函數

+0

你可以發佈兩個實現嗎? 「除了一些細節之外」非常模糊,我對好多細節感到好奇。 – tktsubota

回答

0

可以注入相同的功能到兩個類:

@objc protocol MyProto { 
    func someFunc() 
} 
extension MyProto { 
    func someFunc() { 
     print("howdy") 
    } 
} 
class MyTableViewCell : UITableViewCell, MyProto { 
} 
class MyCollectionViewCell : UICollectionViewCell, MyProto { 
} 
let cell1 = MyTableViewCell() 
cell1.someFunc() // "howdy" 
let cell2 = MyCollectionViewCell() 
cell2.someFunc() // "howdy" 

然後,通過從基體子類

例如創建子類使用它們

...顯示他們都做同樣的事情,沒有重複的代碼。

+0

謝謝,這正是我一直在尋找的!我會閱讀協議擴展。你認爲我應該把協議和它的擴展插入到一個新的Swift文件中,以提高可讀性嗎? – Tometoyou

+0

它應該無關緊要你把它們放在哪裏。他們必須在某個快速檔案的頂層,這就是最重要的。 – matt

+0

是的,我只是想知道從可讀性的角度來看,這種事情的最佳實踐是什麼。 – Tometoyou

0

您不需要UITableViewCellUICollectionViewCell的任何進一步的協議聲明。

只需從每個分別創建一個基類子類並實現您需要的方法。使用協議加上協議擴展

class BaseTableViewCell: UITableViewCell { 

    @IBOutlet var foo : UILabel! 

    var bar = false 

    func method1() {} 
    func method2() {} 

} 

class MySpecialTableViewCell: BaseTableViewCell { }