Swift忘记对象是一种类型

时间:2016-05-18 20:13:11

标签: swift protocols

当在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吗?

2 个答案:

答案 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编程语言指南”
  

您可以使用类型转换中描述的isas运算符来检查协议一致性,以及转换为特定协议。

     

is运算符如果实例符合协议则返回true,如果不符合则返回false

     

downcast运算符的as?版本返回协议类型的可选值,如果实例不符合该协议,则此值为nil

     

请注意,基础对象不会被转换过程更改...但是,在它们存储在[unwrapped optional]常量中时,它们只是已知类型为[protocol],因此仅可以访问他们的[协议特定]属性。