【发布时间】:2018-12-25 19:51:34
【问题描述】:
所以我正在为 UITableView 创建一些视图模型。表格有不同的单元格类型,所以我使用了泛型,但是将它们放入数组时出现了一些问题。
首先我定义了一个结构:
private struct Section<E, C> where C: UITableViewCell {
let cell: C.Type
let rows: [E]
let configure: (_ row: E, _ cell: inout C, _ index: Int) -> Void
}
然后我声明了一个数组:
private lazy var sections: [Any] = [
Section(cell: TextFieldTableViewCell.self,
rows: [
TableRow(image: R.image.home.device.settings.name(),
title: R.string.localizable.deviceSettingsViewControllerElementDeviceName(),
content: device.name,
action: { _ in
}),
TableRow(image: R.image.home.device.settings.location(),
title: R.string.localizable.deviceSettingsViewControllerElementDeviceLocation(),
content: device.location,
action: { _ in
})],
configure: { row, cell, index in
}),
Section(cell: DeviceSettingsNightVisionTableViewCell.self,
rows: [
TableRow(image: R.image.home.device.settings.nightVision(),
title: R.string.localizable.deviceSettingsViewControllerElementNightVision(),
content: 0,
action: { _ in
})],
configure: { row, cell, index in
})
]
问题是:
- 我无法指定数组的类型,因为它们实际上是不同的泛型。
- 如果我使用
[Any]作为数组的类型,那么我每次取一个元素,都要转换成对应的类型,这和我原来的设计不符。 - 我做了一些搜索,意识到我可能需要使用协议来解决问题,但我尝试了很多次都失败了。
我期望的结果是,当我取一个元素时,我可以正确地得到它的类型而无需转换。
我目前的做法是这样的:
在numberOfRowsInSection:,
switch section {
case 0:
return (self.sections[section] as! Section<TableRow, TextFieldTableViewCell>).rows.count
case 1:
return (self.sections[section] as! Section<TableRow, DeviceSettingsNightVisionTableViewCell>).rows.count
default:
return 0
}
显然不够优雅,请问有没有更好的解决方案,任何帮助或建议都非常感谢。
【问题讨论】: