2016-07-26 110 views
0

問題只允許某些類別的斯威夫特符合協議

我想創建只能由特定的類實現的協議。

比方說,有一個協議X,因此,只有一流的A能夠符合它:

A:X 

XA,但不是每一個AX

實踐例

我想創建一個CollectionViewCell描述符定義CellClass,其reuseIdentifier和可選value通該描述符到合適的細胞中的控制器:

協議

protocol ConfigurableCollectionCell { // Should be of UICollectionViewCell class 
    func configureCell(descriptor: CollectionCellDescriptor) 
} 

C ontroller

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let descriptor = dataSource.itemAtIndexPath(indexPath) 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(descriptor.reuseIdentifier, forIndexPath: indexPath) as! ConfigurableCollectionCell 
    cell.configureCell(descriptor) 
    return cell as! UICollectionViewCell 
    } 

現在我需要強制投擺脫錯誤的,因爲ConfigurableCollectionCell != UICollectionViewCell

+0

爲什麼不是一個子類別? – Wain

回答

0

通過轉換成協議,並使用另一個變量修正:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let descriptor = dataSource.itemAtIndexPath(indexPath) 

    // Cast to protocol and configure 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(descriptor.reuseIdentifier, forIndexPath: indexPath) 
    if let configurableCell = cell as? ConfigurableCollectionCell { 
     configurableCell.configureCell(descriptor) 
    } 
    // Return still an instance of UICollectionView 
    return cell 
    } 
相關問題