如何在Swift中创建全局变量?

10
我正在尝试设置一个全局变量,仅仅是一个布尔标志来指示是否首次呈现视图:
var initialLoadFlag: Bool = true

在呈现视图之后,我希望将此标志设置为false:

var initialLoadFlag: Bool = false

然后从那时起检查它:

if initialLoadFlag {
   showWelcomeMessage() 
}

所以,我想创建一个全局变量initialLoadFlag。在哪里和如何创建?我尝试过:
  • 在我的视图控制器的viewDidLoad区域
  • 在我的AppDelegate.swift文件中的application()方法中
  • AppDelegate类中
没有成功。我收到了一个Use of unresolved identifier 'initialLoadFlag'错误消息。
(注:我意识到在这个问题中,我暴露了我对Swift中作用域处理的无知。请原谅我...我在赶期限,而且对这种语言还很陌生。)
感谢您的帮助。

这需要为每个视图都具体化吗?此外,您需要将其保留在多个应用程序运行之间吗? - Gabriele Petronella
仅需要一个视图:主细节控制器的详细视图。不,它不需要在多个应用程序运行之间持久存在。 - kmiklas
2个回答

25
你可以定义一个带有静态字段的结构体:

你可以定义一个带有静态字段的结构体:

struct MyViewState {
    static var initialLoadFlag = false
}

用法:

// set
MyViewState.initialLoadFlag = true

// get
let state = MyViewState.initialLoadFlag
println("My view state:\(state)")

备注: 单例模式和全局变量这样的黑科技通常在设计不良的情况下才需要。也许您可以将状态存储在NSUserDefaults中?或者将其存储在某个会话对象中,该对象可以在任何需要知道上下文的ViewController中注入。

备注: 单例模式和全局变量这样的技巧通常在设计不良的情况下才需要。也许您可以将状态存储在NSUserDefaults中?或者将其存储在某个会话对象中,该对象可以在任何需要了解上下文的ViewController中注入。


1
我们应该把结构体放在哪里?我得到了一个“未解决的标识符'MyViewState'”错误。 - tong
在一个新的.swift文件中添加@tong。 - Reza_Rg
1
说实话,使用 NSUserDefaults 就相当于使用单例模式(实际上,在许多方面更糟糕)。 - Rob
我有很多变量可以由用户配置,基本上是在许多VC中进行皮肤设置。如何原子地更新它们? - μολὼν.λαβέ
好的,我有点困惑。单例模式和用户默认设置有什么区别?@Rob,为什么用户默认设置更糟糕?难道这不是用户默认设置的本意吗? - Jeff
@Jeff - 我并不是在主张单例模式优于用户默认设置。它们都不适合用于状态变量。我的观点仅仅是用户默认设置“被称为_defaults_,因为它们通常用于确定应用程序在启动时的默认状态或默认操作方式。”将其用于随机状态变量与此存储的意图相反。一个人可以使用它来保存任何想要的东西,但问题是是否应该这样做。但是单例和默认设置都存在类似的问题;依赖性被隐藏,调试/测试更加困难。依赖注入更加健壮。 - Rob

3
您可以在主控制器中存储一个标志,并在执行到详细控制器的跳转时将其设置为true。例如:

您可以在主控制器中存储标志,并在执行到详细控制器的跳转时将其设置为true。例如:

class MasterViewController: UIViewController {

    var firstTimePresenting = true

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showDetail" {
            if firstTimePresenting {
                println("First time!")
                firstTimePresenting = false
            }
        }
    }
}

这非常有帮助。实际上,我最终将变量设置为详细视图控制器中的didSet例程的一部分:self.firstload = false。非常感谢您。 - kmiklas
当你说“主控制器”时,你是指一个名为主控制器的新Swift文件还是AppDelegate文件? - Darrow Hartman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接