Лучшая практика SWIFT для обмена переменной между контроллерами представления и внутри функций класса - PullRequest
0 голосов
/ 10 июля 2020

Думаю, я проследил проблему ошибки Член экземпляра 'txtProblem' не может использоваться с типом 'TextProblemViewController' , однако мне интересно, как лучше всего справляться с базовым проблема.

У меня есть глобальная структура данных TextProblems , которую я использую для получения данных JSON. Эти данные используются несколькими контроллерами представления. Вот почему я объявил его как глобальную переменную

var problems:TextProblems!

class TextProblemViewController: UIViewController {

Теперь я хотел разбить свой viewDidLoad () на части и переместить код в отдельную функцию, таким образом,

override func viewDidLoad() {
  super.viewDidLoad()
  do {
    problems = try readJsonProblem()
  } catch {
    print(error.localizedDescription)
  }
  txtProblem.text = fillParamters(textRaw: problems.textProblem[i].problemStmnt.problemText, parameters: problems.textProblem[i].problemStmnt.problemPrmtr.map {$0.param})

стало

let ProblemStmntView: UIView = {
  let view = UIView()
  view.frame = CGRect(x: 0, y: 0, width: 100, height: 200)
  view.backgroundColor = UIColor.white
  txtProblem.text = fillParamters(textRaw: problems.textProblem[i].problemStmnt.problemText, parameters: problems.textProblem[i].problemStmnt.problemPrmtr.map {$0.param})
  return view
}()
    
override func viewDidLoad() {
  super.viewDidLoad()
  do {
      problems = try readJsonProblem()
  } catch {
      print(error.localizedDescription)
  }
  view.addSubview(ProblemStmntView)

Это приводит к приведенному выше сообщению об ошибке в строке txtProblem.text = fillParameters , где txtProblem нас IBOutlet метки Я видел 3 разрешения и представляю себе 3-е - и Думаю, их больше:

  1. объявить переменную как stati c (но это не работает вне класса при объявлении глобальной переменной

  2. сделать переменную ленивой, однако, я думаю, я не могу объявить IBOutlet как ленивый

  3. передать данные из viewDidLoad в мое закрытие (пример показал передачу его функции в качестве решения ), однако не уверен, как передать данные в закрытие инициализации

  4. объявить глобальную переменную как stati c в структуре

Итак, мой вопрос: что? • Считаете ли вы, что это лучшая практика при совместном использовании данных, не инициализированных до времени выполнения, между контроллерами представления и функциями классов? Вы бы объявили глобальную переменную или каким-то образом передавали данные между контроллерами представления, функциями (и закрытием инициализации ???)?

...