如何检查UICollectionViewCell子类是否符合协议

时间:2018-06-08 13:24:00

标签: ios swift

我有一个符合类协议VideoProtocol的UICollectionViewCell:

class VideoCell : UICollectionViewCell, VideoProtocol {

}

我正在尝试获取可见UICollectionViewCells的数组并对其进行过滤,以便我只获得符合VideoProtocol的数组:

for cell in collectionView.visibleCells {
    //Do something here to check conformity
}

我该怎么做?我想确保它们具有UICollectionViewCellVideoProtocol的属性。

3 个答案:

答案 0 :(得分:0)

for cell in collectionView.visibleCells 
{
    if let videoCell = cell as? VideoProtocol
    {
        // do your stuff
    }
}

答案 1 :(得分:0)

let videoCells = collectionView.visibleCells.compactMap {
    $0 as? (UICollectionViewCell & VideoProtocol)
}

注意:如果您使用的是Swift< 4.1

,请使用flatMap代替compactMap

这个小剪裁应将videoCells定义为符合UICollectionViewCell的{​​{1}}数组。如果您不需要访问VideoProtocol定义的内容之外的任何内容,则可以从VideoProtocol广告投放中移除UICollectionViewCell,然后只需编写as?

如果您不需要,只是想检查单元格是否符合协议而不访问协议中定义的任何内容,您可以通过

轻松完成
as? VideoProtocol

然后您可以使用它:

let videoCells = collectionView.visibleCells.filter { $0 is VideoProtocol }

答案 2 :(得分:0)

在每个for循环中检查协议一致性;
其中 collectionView.visibleCells 是一个 UICollectionViewCell 数组。

for case let cell as VideoProtocol in collectionView.visibleCells {
   // do something with cell
   // cell is type VideoProtocol
}

您也可以在 for 循环期间使用 where 子句,但这不会对变量进行类型转换,这意味着当您从 for 循环内访问变量时,您将不会从协议访问 API .

for cell in collectionView.visibleCells where cell is VideoProtocol {
   // do something with cell
   // cell is type UICollectionViewCell
}