【问题标题】:Downcasting to Protocol constrained by associated type向下转换为受关联类型约束的协议
【发布时间】:2020-07-12 15:25:05
【问题描述】:

我已经定义了一个协议如下:

protocol CustomCell where Self: UICollectionViewCell {

    associatedType Config
    var cellConfiguration: Config!
    func setup(with configuration: Config)

}

然后我有一个自定义 UICollectionViewCell:

class RedCollectionViewCell: UICollectionViewCell, CustomCell {

    var cellConfiguration: RedCollectionViewCellConfiguration!

    func setup(with configuration: Config) {
       ...
    }

   ...awakeFromNib and other functions...

}

RedCollectionViewCellConfiguration 的定义位置:

class RedCollectionViewCellConfiguration: NSCoding {
     ...
}

最终目标是拥有许多不同的自定义 UICollectionViewCell,它们都符合 CustomCell,每个都定义自己的自定义配置类(因为每种类型的自定义集合视图单元格将需要不同的配置,因为它们将包含不同类型的数据) .我计划将单元配置存储在 Core Data 中,然后在 ViewController.collectionView(_:cellForItemAt:) 中检索它。在ViewController.collectionView(_:cellForItemAt:) 我正在尝试这样做:

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
if let cell = cell as? CustomCell {
    cell.setup(tile,with: configuration)
}

由于情绪低落,我收到以下错误: Protocol 'CustomCell' 只能用作通用约束,因为它具有 Self 或关联的类型要求

我在 Stack Overflow 上看到过其他答案,但没有任何帮助。有没有替代方法来解决这个问题?我考虑过在 CustomCell 中不包括 associatedType 和 cellConfiguration,但如果所有符合条件的类型都有一个唯一的配置类,那将是理想的。

【问题讨论】:

    标签: ios swift protocols associated-types typecasting-operator


    【解决方案1】:

    显然,您需要删除关联的类型,因为泛型会妨碍您,而且您从一开始就不需要泛型。你也不需要协议。没有什么可以统一的。

    想一想:“每个人都定义自己的自定义配置类”这对我来说毫无意义。 那个是如何工作的?什么会统一这些类?为什么他们需要统一?

    就我个人而言,我不明白为什么您不只使用不同的单元子类,每个子类都声明自己的配置方法、配置数据类型等,然后就这样吧。我就是做这个的。请记住,一个类可以只声明它自己的内部内容,包括数据类型。那么你就可以准确地说出你想说的话:

    if let cell = cell as? CustomCell {
        cell.setup(tile,with: configuration)
    }
    

    因为setupconfiguration 的任何类型都只是在CustomCell 中定义的东西。没有关联类型,没有协议,没有泛型,什么都没有。

    class CustomCell: UITableViewCell {
        struct Config { // ...
        func setup(with config: Config) // ...
        // ...
    }
    

    【讨论】:

    • 自定义配置类的主要原因是每个单元不仅会彼此非常不同,而且我们希望它们每个都有很多变化/自定义。我们无法持久保存这些选项,因为其他单元格没有相同的选项,因此需要一个包含选项的对象,这是每个单元格的唯一配置。
    • 很好,我刚刚说了怎么做。为每个单元格使用不同的单元格类,每个单元格都有自己的配置方法和自己的数据类型。这里没有什么要统一的,你不需要泛型或协议。好的,现在我只是在重复自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多