我想创建一个全局变量。 我想在任何地方访问这个变量。
Java等价物:
static var score:int = 0;
例如,如果我将全局变量定义到Game类中。 如何访问这个全局变量?
Game.score ?
答案 0 :(得分:94)
如果您的应用程序中有多个视图,并且在这种情况下您希望每个视图都可以访问一个变量,那么您应该始终创建一个Model / Data类并在其中定义变量。像这样:
目标C:
//DataClass.h
@interface DataClass : NSObject {
NSString *str;
}
@property(nonatomic,retain)NSString *str;
+(DataClass*)getInstance;
@end
//DataClass.m
@implementation DataClass
@synthesize str;
static DataClass *instance = nil;
+(DataClass *)getInstance
{
@synchronized(self)
{
if(instance==nil)
{
instance= [DataClass new];
}
}
return instance;
}
现在在视图控制器中,您需要将此方法称为:
DataClass *obj=[DataClass getInstance];
obj.str= @"I am Global variable";
每个视图控制器都可以访问此变量。您只需要创建一个Data类的实例。
斯威夫特:
class DataClass {
private var str: String!
class var sharedManager: DataClass {
struct Static {
static let instance = DataClass()
}
return Static.instance
}
}
用法:DataClass.sharedManager.str
使用dispatch_once
class DataClass {
private var str: String!
class var sharedInstance: DataClass {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: DataClass? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = DataClass()
}
return Static.instance!
}
}
用法:DataClass.sharedManager.str
答案 1 :(得分:20)
Objective-C不直接支持“类变量”。相反,您可以创建一个对类的文件范围有效的变量,并使用类方法访问它。
// outside the implementation
static int score = 0; // static means it is only accessible from the current file
@implementation Game
+ (int)score {
return score;
}
+ (void)setScore:(int)newScore {
score = newScore;
}
答案 2 :(得分:7)
在iOS项目中实现全局变量的首选方法(尽管这些不是真正的全局变量)是在应用程序委托中创建属性,然后只从每个类访问该属性。
编辑:重新阅读你的问题,看起来我误解了你的问题,而ughoavgfhw的回答可能正是你所寻找的。他是正确的,在Objective-C中没有类变量这样的东西,所以你必须创建一个常规的C静态变量,然后创建类方法(用+
而不是-
表示)设置和获取。
虽然一般来说,当我在应用程序中需要“全局”变量时,我会创建单例类来容纳它们及其相关方法(因此app委托不会溢出不相关的属性),或者如果它是一个较小的项目我只是使用应用程序委托(也是一个单例类)而不是单独的单例。虽然静态变量加类setter / getter方法没有任何问题,如果它更适合您的需求。