在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,请看下面的答案。我最终采纳了你的建议。