我已经定义了以下协议:
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,但是如果所有符合类型的类型都具有唯一的配置类,那将是理想的选择。
答案 0 :(得分:0)
很显然,您需要删除关联的类型,因为通用方法已成为您的方式,而且您一开始就不需要通用类型。您也不需要该协议。没有什么可以统一的。
对此进行思考:“每个人都定义自己的自定义配置类”对我来说毫无意义。 那如何运作?什么将统一这些这些类?为什么他们需要统一?
个人而言,我不明白为什么您不只是使用不同的单元子类,每个子类都声明其自己的配置方法,配置数据类型等,并将其留在那。我就是做这个的。记住,一个类可以声明自己的内部内容,包括数据类型。因此,您可以准确地说出您要说的话:
if let cell = cell as? CustomCell {
cell.setup(tile,with: configuration)
}
因为setup
和configuration
的类型都是在CustomCell内部定义的。没有关联的类型,没有协议,没有泛型,什么都没有。
class CustomCell: UITableViewCell {
struct Config { // ...
func setup(with config: Config) // ...
// ...
}