2015-07-03 120 views
1

我想創建一個繼承自UICollectionViewDataSource的協議,並使用協議擴展來提供所需的UICollectionViewDataSource方法的默認實現。但是,當我嘗試聲明符合此協議的類時,編譯器會說Type 'MyClass' does not conform to protocol UICollectionViewDataSource'您可以擴展從另一個協議繼承的協議嗎?

protocol MyDataSource : UICollectionViewDataSource { 
    var values: [String] { get } 
} 

extension MyDataSource { 
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = UICollectionViewCell() // TODO: dequeue 
     // TODO: configure cell ... 
     return cell 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return self.values.count 
    } 
} 

class MyClass : NSObject, MyDataSource { 
    var values = [String]() 
} 

我也曾嘗試宣告擴展爲以下,但仍收到相同的編譯器錯誤:

extension UICollectionViewDataSource where Self : MyDataSource 

我甚至試過這種擴大到所有UICollectionViewDataSources,看是否繼承部分單獨將工作,但沒有骰子相同的錯誤。

extension UICollectionViewDataSource 

回答

5

不幸的是,你想要做的是不可能的。問題是這是一個Objective-C協議。 Objective-C從來沒有聽說過協議擴展。因此它不知道這個協議擴展是向MyClass注入兩個函數。它看不到它們,就其而言,協議要求不被滿足。

+0

我不明白爲什麼子類化是不好的。這正是我即將提出的建議。這就是我們在協議擴展出現之前做了數百年的通用功能的繼承,對我們來說這已經足夠了! – matt

+0

我已經找到了一些很棒的用途。當然,它們已經徹底改變了標準庫的結構。 – matt