在swift中创建一个全局变量

时间:2017-06-27 13:06:02

标签: swift xcode swift3

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

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

这是该类的定义方式:

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.
    }
}

但是我收到以下错误:

"'model' is not a member type of "CustomTabBarController"

如何声明它以便我可以访问模型?感谢。

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

我需要在tabbar的每个选项卡中将模型数据作为SAME。例如,如果我在第一个标签中将年龄更改为51,则第二个标签栏应该检索51.以上哪种方法可以通过这种方式使用它?

更新#2

我可以使用院长的建议在函数内创建变量:

func setupModelData()
{
  var modelData = (self.tabBarController as! CustomTabBarController).model
}

但是这不起作用,因为我需要从其他函数访问modelData。当我尝试将此行移动到函数之外时,如下所示:

import UIKit

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
 var modelData = (self.tabBarController as! CustomTabBarController).model
...

我收到错误:

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

3 个答案:

答案 0 :(得分:5)

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

import UIKit
class ModelData: NSObject {
    static let shared: ModelData = ModelData()
    var name = "Fred"
    var age = 50
}

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

ModelData.shared.age = 51

在第二个视图中阅读:年龄为51

let age = ModelData.shared.age

答案 1 :(得分:1)

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

1)全球模式

此行尝试从CustomerTabBarController 获取模型属性 - 即,如果您创建了多个标签栏控制器,则它们都将使用相同的模型。

var modelData: CustomTabBarController.model

如果这是您想要的,那么您需要更改此行以包含static关键字。

static var model = ModelData()

但是,这几乎肯定不是你所追求的。

2)共享实例变量

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

var modelData: myCustomTabBarController.model

在不了解您的架构的情况下,我无法帮助您掌握标签栏控制器实例,但这样的事情可能会起作用(在其他视图控制器内):

var modelData = (self.tabBarController as! CustomTabBarController).model

答案 2 :(得分:0)

model是一个实例变量。

创建CustomTabBarController

的实例
var modelData =  CustomTabBarController().model

或者将model声明为类变量

static var model = ModelData()

...

var modelData = CustomTabBarController.model

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

struct ModelData {
    static var name = "Fred"
    static var age = 50
}

您可以从任何地方访问该名称,例如

let name = ModelData.name

并且不需要在另一个类中创建额外的变量。

An - 基于实例 - 替代是单身

struct ModelData {

    static let shared = ModelData()

    var name = "Fred"
    var age = 50
}

并使用它

let name = ModelData.shared.name