只允许某些类符合Swift中的协议

时间:2016-07-26 16:44:55

标签: ios swift uicollectionview protocols swift-protocols

问题

我想创建一个只能由某个类实现的协议。

示例

比方说,有一个协议X,所以只有类A可以符合它:

A:X

每个X都是A,但不是每个A都是X

实践示例

我想创建一个CollectionViewCell描述符,用于定义CellClass,其reuseIdentifier和可选value将该描述符传递给控制器​​中的相应单元格:

协议

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

控制器

  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

1 个答案:

答案 0 :(得分: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
  }