在swift中创建全局变量

在swift中创建全局变量,swift,xcode,swift3,Swift,Xcode,Swift3,我试图从我的视图控制器(在类内部但在函数外部)创建一个全局变量,如下所示: var modelData: CustomTabBarController.model // THE ERROR IS HERE import UIKit class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var modelData = (self.tabBarController

我试图从我的视图控制器(在类内部但在函数外部)创建一个全局变量,如下所示:

var modelData: CustomTabBarController.model   // THE ERROR IS HERE
import UIKit

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
 var modelData = (self.tabBarController as! CustomTabBarController).model
...
这就是该类的定义方式:

CustomTabBarController.swift:

import UIKit

// This class holds the data for my model.
class ModelData {
    var name = "Fred"
    var age = 50
}

class CustomTabBarController: UITabBarController {

    // Instantiate the one copy of the model data that will be accessed
    // by all of the tabs.
    var model = ModelData()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
}
ModelData.shared.age = 51
但是,我得到以下错误:

"'model' is not a member type of "CustomTabBarController"
如何声明它以便访问模型?谢谢

更新#1 对不起,我忘了提这个:

我需要模型数据在选项卡栏的每个选项卡中都相同。例如,如果我在第一个选项卡中将年龄更改为51,则第二个选项卡栏应检索51。上面哪种方法是正确的

更新#2

我能够根据dean的建议在函数中创建变量:

func setupModelData()
{
  var modelData = (self.tabBarController as! CustomTabBarController).model
}
但是,这不起作用,因为我需要从其他函数访问modelData。当我尝试将此行移到函数外时,如下所示:

var modelData: CustomTabBarController.model   // THE ERROR IS HERE
import UIKit

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
 var modelData = (self.tabBarController as! CustomTabBarController).model
...
我收到错误消息:

Value of type '(NSObject) -> () -> FirstViewController' has no member 'tabBarController'

model
是一个实例变量

创建
CustomTabBarController

var modelData =  CustomTabBarController().model
或者将
模型
声明为类变量

static var model = ModelData()

...

var modelData = CustomTabBarController.model

但是,要将
ModelData
用作具有两个成员的单个全局变量,请使用结构而不是类,并将成员声明为静态

struct ModelData {
    static var name = "Fred"
    static var age = 50
}
例如,您可以从任何地方访问该名称

let name = ModelData.name
并且不需要在另一个类中创建额外的变量


基于实例的替代方案是单例

struct ModelData {

    static let shared = ModelData()

    var name = "Fred"
    var age = 50
}
并使用它

let name = ModelData.shared.name

我不确定您是真正想要一个全局变量(即在所有视图控制器之间共享的ModelData的单个实例)还是一个公共的实例变量,因此我将尝试回答这两个问题:)

1)全球模式

此行尝试从
CustomerTabBarController
类中获取模型属性-即,如果您制作了多个选项卡栏控制器,它们都将使用相同的模型

var modelData: CustomTabBarController.model
如果这是您想要的,那么您需要更改此行以包含static关键字

static var model = ModelData()
然而,这几乎肯定不是你想要的

2)共享实例变量

这意味着该模型是
CustomTabBarController
的每个实例的一部分。在这里,您需要将抛出错误的行更改为如下内容:

var modelData: myCustomTabBarController.model
如果不进一步了解您的体系结构,我无法帮助您掌握选项卡栏控制器实例,但类似的操作可能会起作用(在其他视图控制器中):


我最终遵循了holex关于创建共享类(singleton)的建议:

在第一视图中写作:将年龄设置为51:

import UIKit

// This class holds the data for my model.
class ModelData {
    var name = "Fred"
    var age = 50
}

class CustomTabBarController: UITabBarController {

    // Instantiate the one copy of the model data that will be accessed
    // by all of the tabs.
    var model = ModelData()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
}
ModelData.shared.age = 51
第二视角阅读:51岁

let age = ModelData.shared.age

谢谢,瓦迪安。快速提问,我需要每个选项卡中的模型数据都相同。例如,如果我在第一个选项卡中将年龄更改为51,则第二个选项卡栏应检索51。上面哪种方法是正确的?迪恩,谢谢。我正在尝试使用这一行:var modelData=(self.tabBarController as!CustomTabBarController)。model但我收到了错误“NSObject FirstViewController类型的值没有成员tabBarController”,我正在尝试使用第一个选项卡上的这一行。第一个选项卡也嵌入到导航控制器中。看起来
FirstViewController
不是
UIViewController
的子类。我尝试此操作时,它确实继承了UIViewController、UITableViewDelegate和uitableviewdatasource(键入以复制错误消息)我得到的
类型“ViewController”的值没有成员“tabBarControllerr”
-您的错误是说NSObject,但我的有ViewController,这告诉我您对FirstViewController的定义发生了一些有趣的事我得到的确切错误是:“类型的值”(NSObject)->()->FirstViewController”没有成员“tabBarController”那你为什么不创造一个单身汉呢?比随机全局变量好得多。谢谢Holex,请看下面的答案。我最终采纳了你的建议。