考虑一个例子:
protocol CellConfigurator {
var cellClass: UICollectionViewCell.Type {get}
func configure(cell: UICollectionViewCell)
}
class AppleCell: UICollectionViewCell {
let title = UILabel()
}
class AppleCellConfigurator: CellConfigurator {
let cellClass: UICollectionViewCell.Type = AppleCell.self
func configure(cell: UICollectionViewCell) {
guard let cell = cell as? AppleCell else {return}
cell.title.text = "AAPL"
}
}
我可以使用上述模式来封装UICollectionViewCell
的实际类型,如下使用(伪代码):
func cellAt(indexPath: IndexPath) -> UICollectionViewCell {
let configurator = configurators[indexPath]
let cell = collectionView.dequeueReusableCell(identifier: String(describing: configurator.cellClass))
configurator.configure(cell)
return cell
}
例如,我希望摆脱使用CellConfigurator
的每个符合要求的单元格类型转换的必要性,例如,使用具有关联类型的协议:
protocol CellConfigurator {
associatedtype Cell
func configure(cell: Cell)
}
class AppleCell: UICollectionViewCell {
let title = UILabel()
}
class AppleCellConfigurator: CellConfigurator {
typealias Cell = AppleCell
func configure(cell: Cell) {
cell.title.text = "AAPL"
}
}
但是,由于出现错误,我无法将它们放在一个数组中:“ Protocol'SomeProtocol'只能用作通用约束,因为它具有Self或关联的类型要求”。
有什么方法可以实现两个目标:
UICollectionViewCell
参数类型的函数可以用于任何CellConfigurator
?答案 0 :(得分:0)
您可以在CellConfigurator中使用关联类型:
protocol CellConfigurator: class {
associatedtype CellType where CellType: UICollectionViewCell
func configure(cell: CellType)
}
class AppleCell: UICollectionViewCell {
let title = UILabel()
}
class AppleCellConfigurator: CellConfigurator {
typealias CellType = AppleCell
func configure(cell: CellType) {
cell.title.text = "AAPL"
}
}