我有一个符合类协议VideoProtocol
的UICollectionViewCell:
class VideoCell : UICollectionViewCell, VideoProtocol {
}
我正在尝试获取可见UICollectionViewCells
的数组并对其进行过滤,以便我只获得符合VideoProtocol
的数组:
for cell in collectionView.visibleCells {
//Do something here to check conformity
}
我该怎么做?我想确保它们具有UICollectionViewCell
和VideoProtocol
的属性。
答案 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
}