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

时间:2020-07-12 15:25:05

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

我已经定义了以下协议:

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 {
     ...
}

最终目标是拥有许多都符合CustomCell的不同自定义UICollectionViewCell,每个自定义UICollectionViewCell都定义自己的自定义配置类(因为每种类型的自定义集合视图单元将需要不同的配置,因为它们将包含不同类型的数据) 。我打算将单元配置存储在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,但是如果所有符合类型的类型都具有唯一的配置类,那将是理想的选择。

1 个答案:

答案 0 :(得分:0)

很显然,您需要删除关联的类型,因为通用方法已成为您的方式,而且您一开始就不需要通用类型。您也不需要该协议。没有什么可以统一的。

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

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

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

因为setupconfiguration的类型都是在CustomCell内部定义的。没有关联的类型,没有协议,没有泛型,什么都没有。

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