Swift中的Casting问题

时间:2016-08-16 16:07:15

标签: swift

我有两个UICollectionViewCells,我想区分两者。我的RetroItemCollectionViewCell有一个名为" configureFor"的方法。出于某种原因,即使我投了它,我也无法调用" configureFor"功能。

 var cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)

        if cell is RetroItemCollectionViewCell {

            cell = cell as! RetroItemCollectionViewCell
            let retroItem = self.retroItems[indexPath.row]
            cell.configureFor(retroItem: retroItem)

        } else if cell is RetroItemAddCollectionViewCell {

        }

我做错了什么?

更新:

var cell :UICollectionViewCell!

// check if the cell is the add cell
if indexPath.row == 0 {

    cell = collectionView.dequeueReusableCell(withReuseIdentifier: addRetroItemCollectionViewCellReuseIdentifier, for: indexPath) as! RetroItemAddCollectionViewCell


} else {

    // HOW DO I CONVERT THE cell to RetroItemCollectionViewCell

    let retroItem = self.retroItems[indexPath.row]

    cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! RetroItemCollectionViewCell

}

1 个答案:

答案 0 :(得分:3)

您正在搜索as?运营商

  

作为? operator将表达式的条件转换执行到指定的类型。作为? operator返回指定类型的可选项。在运行时,如果转换成功,表达式的值将包装在一个可选的并返回;否则,返回的值为零。 - Swift Language Reference

var cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)

if let cell as? RetroItemCollectionViewCell {
    let retroItem = self.retroItems[indexPath.row]
    cell.configureFor(retroItem: retroItem)
} else if let cell as? RetroItemAddCollectionViewCell {
    // ...
}