Я вижу два пути для вас, чтобы достичь этого. Во-первых, согласно комментарию Ильямани, вы можете использовать общий протокол. Во-вторых, вы можете обернуть ваши типы в перечисление.
Вариант 1
Предположим, что свойство name
является единственным распространенным среди вашего типа. Таким образом, вы можете создать протокол как:
protocol Nameable {
var name: String { get }
}
Тогда приведите свои типы в соответствие с этим:
struct Auditorie: Codable, Nameable {
let id: Int
let name: String
let building: Building
}
struct Building: Codable, Nameable {
let name: String
let abbr: String
}
struct Group: Codable, Nameable {
let id: Int
let name: String
}
Таким образом, ваш roomsAndGroups
теперь должен состоять из Nameable
:
var roomsAndGroups: [[Nameable]]()
А в методах источника данных табличного представления вы можете выбрать эти именованные объекты и заполнить таблицу:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var nameable = roomsAndGroups[indexPath.section][indexPath.row]
...
cell.textLabel?.text = nameable.name
return cell
}
Вариант 2
Оберните ваши типы перечислением как:
enum Wrapper {
case auditorie(Auditorie)
case group(Group)
}
Ваш roomsAndGroups
и метод источника данных табличного представления изменились соответственно:
var roomsAndGroups: [[Wrapper]]()
...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var wrapper = roomsAndGroups[indexPath.section][indexPath.row]
switch wrapper {
case .auditorie(let auditorie):
// Handle cell dequeuing with auditorie object
case .group(let group):
// Handle cell dequeuing with group object
}
}