繁体   English   中英

向下转换为受关联类型约束的协议

[英]Downcasting to Protocol constrained by associated type

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

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,每个都定义自己的自定义配置 class(因为每种类型的自定义集合视图单元格将需要不同的配置,因为它们将包含不同类型的数据)。 我计划将单元配置存储在 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)
}

由于向下转换,我收到以下错误:协议'CustomCell'只能用作通用约束,因为它具有自我或相关类型要求

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM