类变量值未更新

时间:2018-08-16 10:57:47

标签: ios swift class struct

我有一个用Swift编写的iOS应用。
在这个应用程序中,我有多个变量,需要在每个ViewController中都可以访问它们。问题在于我无法在prepare(for segue:, sender:)中传递它们,因为我正在谈论20个变量。

我尝试将它们放在名为GlobalVars的类中,以便在初始ViewController上将数据从DB加载到变量中。在此ViewController中,这是我声明类变量的方式:

var vars: GlobalVars = GlobalVars()

然后,在viewDidLoad()函数中,我将数据加载到类的变量中。

在其他ViewController中,我在开头声明了以下变量:

var vars: GlobalVars = LoadingViewController().vars

问题已经在LoadingViewController中开始。问题在于,显然数据没有保存到类的变量中。

在此类中,每个变量都有初始值,但空值。例如,将数组声明为[]

如何使每个ViewController均可访问变量?我也使用struct而不是class进行了尝试,但是效果也不好。

2 个答案:

答案 0 :(得分:1)

方法1-全局变量(不推荐)

将它们声明为任何类之外的全局变量。

var vars: GlobalVars = GlobalVars()

方法2-共享实例

在类内将它们声明为静态变量:

class GlobalVars {
    static var shared: GlobalVars = GlobalVars() 

    // Your variables and other stuff
}

您可以使用后跟.运算符的类名来访问变量。

GlobalVars.shared.variable = // Store something

答案 1 :(得分:1)

全局变量不好,但共享实例(单例)也很糟糕。单例永远存在,可以在代码中的任何位置访问单例,使单元测试变得困难等。

请考虑依赖注入。

理想情况:

final class MutableVariables {
    var firstVariable: String
    var secondVariable: String
}

final class ViewController: UIViewController {

    private var variables: MutableVariables

    init(injectedDependency: MutableVariables) {
        self.variables = injectedDependency
    }

    func doStuff() {
        self.variables.firstVariable = "foo"
    }
}   

func startMyApp() {
    let variables = MutableVariables() //keep hold of this somewhere
    let viewController = ViewController(injectedDependency: variables)
    present(viewController)

    let anotherViewController = ViewController(injectedDependency: variables)
    present(viewController)
}

但是,由于您使用的是带有剧情的情节提要:

final class ViewController: UIViewController {

    private var variables: MutableVariables!

    func inject(dependency: MutableVariables) {
        self.variables = injectedDependency
    }

    func doStuff() {
        self.variables.firstVariable = "foo"
    }
}   

final class MasterController {

    let variables = MutableVariables()

    func startMyApp() {

        let viewController = ViewController()
        present(viewController)

        let anotherViewController = ViewController()
        present(viewController)
    }

    func segueFinished(for viewController: ViewController) {
        viewController.inject(dependency: self.variables)
    }
}

当然,多个ViewController直接突变同一组变量也同样有问题。考虑让每个ViewController委派给某个父对象(即上面的MasterController),这是唯一可以更改变量的对象。