视图控制器中的依赖注入

问题描述 投票:2回答:4

有人可以在View Controller中解释依赖注入,我们如何摆脱选项?我已经阅读了很多关于它的文章,但却无法清楚地了解它。将数据从一个VC传递到另一个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)
}
ios swift dependency-injection
4个回答
0
投票

在你的例子中,如果你只是想摆脱选项,用var number: [String]?替换你的var number = [String]()。这将创建一个空数组。

当您必须访问此属性时,您不再需要打开它。


0
投票

你可以摆脱它们,但是你需要从代码而不是故事板启动它们。如果你想使用类似的启动方法,那么我认为你能做的最好就是改变选项以强制解包类型并拥有某种静态启动器功能,如下所示:

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
投票

如果你想摆脱选项,有几种选择:

  1. 不要使它们成为可选项并为它们提供默认值。这只适用于当然有合理的默认值的情况。
  2. 让他们隐含地解开。它们仍然是可选项,但你不必处理打开它们。这仅在您确定呈现视图控制器为它们提供值时才有效。
  3. 使用带有值的自定义初始化程序,并在视图控制器初始化时分配属性。这很好,干净,但它不适用于故事板。

0
投票

其他人建议为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
}

如果没有设置,未打开的选项将在使用时崩溃,并且因为它们是私有的,所以不能从类本身外部意外更新它们。

© www.soinside.com 2019 - 2024. All rights reserved.