Как объявить переменную с двумя возможными типами - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть два Core Data entities, которые заполняют UITableView двумя разделами, по одному объекту для каждого раздела.Когда пользователь нажимает на строку таблицы, он направляется в другое представление, куда отправляются данные этой строки.В настоящее время он реализован так:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "editValue") {
        let secondViewController = segue.destination as! EditValuesViewController

        if send_array_inc.isEmpty {
            secondViewController.send_array_exp = send_array_exp
        } else if send_array_exp.isEmpty {
            secondViewController.send_array_inc = send_array_inc
        }
    }
}

Вопрос:

Поскольку существует два объекта, существует два возможных типа (Income и Expenses) для данных, отправляемых в следующем представлении.Как я могу использовать эти данные в следующем представлении с одной переменной?Я делаю следующее в ViewDidLoad, но область действия send_array остается в пределах этой функции.Как я могу сделать send_array доступным снаружи?

if send_array_inc.isEmpty {
     var send_array = [Expenses]()
     send_array = send_array_exp
} else if send_array_exp.isEmpty {
     var send_array = [Income]()
     send_array = send_array_inc
}

В идеале я хочу сделать это без создания отдельного представления для каждого результата , но я открыт для рефакторинга, если другое решение будетбыть лучше и реалистичнее.Спасибо

1 Ответ

0 голосов
/ 23 ноября 2018

Согласуйте два типа объектов данных с общим протоколом.Сделайте контроллер вида представления send_array объектом, соответствующим этому протоколу.

В коде вашего EditValuesViewController запросите send_array, чтобы выяснить, какой тип объекта данных был передан.

Редактировать:

Определить протокол

@protocol dataArrayProtocol {
  var dataArray: Array
}

Определить 2 структуры, которые соответствуют этому протоколу

struct ExpensesArrayStruct: dataArrayProtocol {
  var dataArray: [Expenses]
}

struct IncomeArrayStruct: dataArrayProtocol {
  var dataArray: [Income]
}

дать вашему EditValuesViewController свойство, соответствующее этому классу протоколаEditValuesViewController: UIViewController {var dataArrayStruct: dataArrayProtocol}

И ваш prepare(for:sender) метод

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "editValue") {
        let secondViewController = segue.destination as! EditValuesViewController

        if send_array_inc.isEmpty {
            secondViewController.dataArrayStruct = ExpensesArrayStruct(dataArray: send_array_exp)
        } else if send_array_exp.isEmpty {
            secondViewController.dataArrayStruct = IncomeArrayStruct(dataArray: send_array_inc)
        }
    }
}

И для обработки данных:

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  if let expensesStruct = dataArrayStruct as? ExpensesArrayStruct {
     //deal with expenses array
  } else if let incomeStruct = dataArrayStruct as? IncomeArrayStruct {
     //deal with income array
  }
}

Обратите внимание, что я ударил этоКод в редакторе SO и не пытался скомпилировать его.Возможно, я сделал несколько незначительных ошибок.Это должно дать вам идею.

...