在使用
UITableView
时,经常创建具体的模型来简化代码:
class Section: NSObject {
var items: [Item]
init(items: [Item]) {
self.items = items
}
}
class Item: NSObject {
var title: String
init(title: String) {
self.title = title
}
}
// ----------
var sections = [Section]()
let item = Item(title: "Title")
let section = Section(items: [item])
sections.append(section)
然后在
UITableView
的数据源方法中实现:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: UITableViewCell.self, for: indexPath)
let item = sections[indexPath.section].items[indexPath.row]
cell.item = item
return cell
}
但是当存在多种类型的
Cell
时,需要创建具体的模型来继承基础模型:
class SectionA: Section {
var some: String?
}
class ItemA: Item {
var isEdit = false
}
此时会产成一个问题,当在
UITableView
的数据源方法中实现模型传递时,需要强转类型:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: UITableViewCell.self, for: indexPath)
let item = sections[indexPath.section].items[indexPath.row] as! SectionA
cell.item = item
return cell
}
如何直接获取类型,而不需要强转呢?需要使用泛型:
class Section<T: Item>: NSObject {
var items: [T]
init(items: [T]) {
self.items = items
}
}
class Item: NSObject {
var title: String
init(title: String) {
self.title = title
}
}
// ----------
class SectionA: Section<ItemA> {
var some: String?
}
class ItemA: Item {
var isEdit = false
}
// ----------
网友评论