我想制作一个通用的TableView DataSource类,其中包含ConfigureModel
的数组:
protocol ConfigureModel {
associatedtype ModelType
var name: String { get set }
var modelDescription: String { get }
}
我还希望TableView单元格是通用的:
class ConfigureCell<ConfigureType>: UITableViewCell, Configure {
func configure<Model: ConfigureModel>(with value: Model) where ConfigureType == Model.ModelType {
let description = value.modelDescription
print("ConfigureCell description: \(description)")
}
}
所以我让ConfigureCell
采用了通用的Configure
协议:
protocol Configure {
associatedtype ConfigureType
func configure<Model: ConfigureModel>(with value: Model) where Model.ModelType == ConfigureType
}
现在,我可以使模型采用ConfigureModel
协议,以便可以在ConfigureCell
类中使用:
struct Tag {
....
}
extension Tag: ConfigureModel {
typealias ModelType = Tag
}
这很好。现在使ObjectDataSource
通用:
class ObjectDataSource<T: ConfigureModel>: NSObject, UITableViewDataSource, UITableViewDelegate {
var values: [T] = []
....
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = self.values[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "TagCell", for: indexPath) as! ConfigureCell<T>
cell.configure(with: item)
在这里,我有一个问题已经尝试了很多小时才能解决。最后一个cell.configure(with: item
语句Xcode显示错误:Instance method 'configure(with:)' requires the types 'T' and 'T.T' be equivalent
我知道我必须在类中创建一个泛型where子句,但是我很难找出应该是什么。
class ObjectDataSource<T: ConfigureModel>: NSObject, UITableViewDataSource, UITableViewDelegate
where T == ???? {
我制作了一个可以工作的Xcode Playground,但是注释掉的部分不起作用。您可以在这里获得它:GenericDataSource Xcode PlayGround
答案 0 :(得分:0)
我还希望TableView单元格是通用的
您根本不需要那个。您已经将configure(with:)
方法定义为通用方法。无需使类本身成为通用类。
鉴于上述声明,如果您同意的话,那么您的实现将非常简单:
class ConfigureCell: UITableViewCell {
func configure<Model: ConfigureModel>(with value: Model) {
let description = value.modelDescription()
print("ConfigureCell description: \(description)")
}
}
class ObjectDataSource<T: ConfigureModel>: NSObject, UITableViewDataSource {
var values: [T] = []
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return values.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = self.values[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "TagCell", for: indexPath) as! ConfigureCell
cell.configure(with: item)
return cell
}
}