当在UICollectionView.visibleCells()中循环通过UICollectionViewCells数组然后检查单元格是否符合协议时,它会忘记单元格是UIView并且具有frame属性。
for cell in collectionView.visibleCells() {
let cellPosition1 = cell.frame.origin
if let cell = cell as? AwesomeCellProtocol {
let cellPosition2 = cell.frame.origin
cell.doAwesome(cellPosition)
}
}
Swift在设置cellPosition2时出现编译错误:
Value of type 'AwesomeCellProtocol' has no member 'frame'
设置cellPosition1可以正常工作。
我可以检查UIView和AwesomeCellProtocol吗?
答案 0 :(得分:2)
使用
if let cell = cell as? AwesomeCellProtocol { ... }
为if-block的范围引入一个新变量cell
,
哪个"阴影"来自for循环外部范围的cell
变量。
该局部变量的类型为AwesomeCellProtocol
,而不是
UICollectionViewCell
。
您可以通过绑定到其他名称来避免此问题:
if let awesomeCell = cell as? AwesomeCellProtocol {
let cellPosition2 = cell.frame.origin
awesomeCell.doAwesome(cellPosition)
}
答案 1 :(得分:1)
当您打开可选项时,您认为它不再是您期望的类型,而是objectWithAwesomeCellProtocol
。
如果您想将其保留为UICollectionViewCell,可以尝试使用is
代替as?
,但是您需要自己处理nil
个案例。< / p>
来自Apple的“{3}}
下的Swift编程语言指南”您可以使用类型转换中描述的
is
和as
运算符来检查协议一致性,以及转换为特定协议。
is
运算符如果实例符合协议则返回true
,如果不符合则返回false
。downcast运算符的
as?
版本返回协议类型的可选值,如果实例不符合该协议,则此值为nil
。请注意,基础对象不会被转换过程更改...但是,在它们存储在[unwrapped optional]常量中时,它们只是已知类型为[protocol],因此仅可以访问他们的[协议特定]属性。