Как заполнить табличный вид 2D массивом? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть 2 массива: roomsArray:[Auditorie] и groupsArray:[Group].Я добавил их в roomsAndGroups:[[Any]].Вопрос в том, как заполнить tableView двумерным массивом или двумя массивами разных типов.

struct Auditorie: Codable {
    let id: Int
    let name: String
    let building: Building
}

struct Building: Codable {
    let name: String
    let abbr: String
}

struct Group: Codable {
    let id: Int
    let name: String
}

fileprivate var roomsArray:[Auditorie] = []
fileprivate var groupsArray:[Group] = []
fileprivate var roomsAndGroups:[[Any]] = []


Массив выглядит так

[[PolyStudents.Group(id: 26025, name: "23254/1"), PolyStudents.Group(id: 26605, name: "43325/2"), PolyStudents.Group(id: 26615, name: "43325/3"), PolyStudents.Group(id: 27121, name: "53325/3"), PolyStudents.Group(id: 26055, name: "33254/1"), PolyStudents.Group(id: 26056, name: "33253/1"), PolyStudents.Group(id: 25976, name: "13254/1"), PolyStudents.Group(id: 26026, name: "23255/1"), PolyStudents.Group(id: 26604, name: "43325/1"), PolyStudents.Group(id: 26057, name: "33255/1")], [PolyStudents.Auditorie(id: 1579, name: "1325", building: PolyStudents.Building(name: "50 учебный корпус", abbr: "50 уч.к")), PolyStudents.Auditorie(id: 1641, name: "325", building: PolyStudents.Building(name: "11-й учебный корпус", abbr: "11 к."))]]

1 Ответ

1 голос
/ 19 апреля 2019

Я вижу два пути для вас, чтобы достичь этого. Во-первых, согласно комментарию Ильямани, вы можете использовать общий протокол. Во-вторых, вы можете обернуть ваши типы в перечисление.

Вариант 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...