Внедрение зависимостей в контроллеры представления - PullRequest
0 голосов
/ 10 сентября 2018

Может ли кто-нибудь объяснить внедрение зависимостей в View Controller, как мы можем избавиться от опций? Я прочитал много статей об этом, но не мог получить большую ясность этого. И это хороший подход для передачи данных из одного VC в другой?

class SecondVC: UIViewController {
    var number: [String]?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.printNumbers()
    }

    func printNumbers() {
        guard let number = self.number else { return }

        print(number)
    }
}

//+++++++ In First View Controller +++++++++++++++++

@IBAction func pushToSecondVC(_ sender: UIButton) {
    let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("SecondVC") as SecondVC
    secondViewController.number = self.numbers
    self.navigationController.pushViewController(secondViewController, animated: true)
}

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Другие здесь предложили установить начальные значения для var. Хотя это означает меньше опций, проблема здесь в том, что легко забыть установить var, что может привести к сложностям в диагностике проблем.

Я предпочитаю private неявно развернутые опции, например

private var number: [String]!
private (set) var someBool: Bool! // private (set) makes it visible but not setable

, а затем configure функция на каждом контроллере представления (или на любом объекте, созданном из раскадровки пера), например,

configure(number: [String], someBool: Bool) {
    self.number = number
    self.someBool = someBool
}

Развернутые опции могут потерпеть крах при использовании, если не установлены, и, поскольку они являются закрытыми, они не могут быть случайно обновлены извне самого класса.

0 голосов
/ 10 сентября 2018

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

final class ViewController: UIViewController {
    var number: [String]!

    static func initiateFromStoryboard(with number: [String]) -> ViewController {
        let viewController = UIStoryBoard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SecondVC") as! ViewController
        viewController.number = number
        return viewController
    }
}

//// Use it like:
...
let vc = ViewController.initiateFromStoryboard(with: ["1","2"])
navigationController?.push(vc) 

Ofc. недостатком является то, что вам нужно следить за свойством number, которое всегда устанавливается перед его использованием, в противном случае ваш код потерпит крах.

0 голосов
/ 10 сентября 2018

Есть несколько вариантов, если вы хотите избавиться от опций:

  1. Не делайте их необязательными и присваивайте им значение по умолчанию. Это работает только при наличии разумных значений по умолчанию.
  2. Сделайте их неявно развернутыми. Они по-прежнему будут опциональными, но вам не придется разбираться с ними. Это работает, только если вы точно знаете, что контроллер представления предоставляет значения для них.
  3. Используйте пользовательские инициализаторы, которые принимают значение и присваивают свойства при инициализации контроллера представления. Это красиво и чисто, но не очень хорошо работает с раскадровками.
0 голосов
/ 10 сентября 2018

В вашем примере, если вы просто хотите избавиться от опций, замените var number: [String]? на var number = [String]().Это создаст пустой массив.

Когда вам нужно получить доступ к этому свойству, вам больше не нужно разворачивать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...