Swift 忘记对象是一种类型

标签 swift protocols

当在 UICollectionView.visibleCells() 中循环遍历 UICollectionViewCells 数组然后检查单元格是否符合协议(protocol)时,它会忘记该单元格是 UIView 并且具有框架属性。

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

最佳答案

if let cell = cell as? AwesomeCellProtocol { ... }

您为 if block 的范围引入了一个新变量 cell, 它从 for 循环的外部范围“隐藏”cell 变量。 该局部变量的类型为 AwesomeCellProtocol 而不是 UICollectionViewCell

您可以通过绑定(bind)到不同的名称来避免该问题:

if let awesomeCell = cell as? AwesomeCellProtocol {

    let cellPosition2 = cell.frame.origin
    awesomeCell.doAwesome(cellPosition)
}

关于Swift 忘记对象是一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37309253/

相关文章:

ios - 使用 NSFetchedResultsController 按日期将 CoreData 模型排列成多个部分

ios - SDWebImage 始终返回错误代码 401

ios - 带有 Swift 5.0 编译器的 Xcode 10.2 - 协议(protocol)继承问题

iis - IIS 在哪里存储有关每个绑定(bind)的 SSL 证书协议(protocol)映射的信息?

clojure 将协议(protocol)定义保存在与实现不同的命名空间中

swift - 多次调用 Swift 闭包是否正确

swift - 类声明和使用

swift - 让 UITableViewRowAction 在点击时反弹

swift - 通用完成作为非通用通过

swift - 为什么我需要指定对象类型两次?