Swift 在类作用域中声明和初始化静态对象
在Objective-C中,一个类通常会保留对该类将多次使用的实例的静态引用。比如说,Swift 在类作用域中声明和初始化静态对象,swift,Swift,在Objective-C中,一个类通常会保留对该类将多次使用的实例的静态引用。比如说, @implementation MyClass static NSDateFormatter *dateFormatter = nil; + (void) initialize { if (self == [MyClass class]) { dateFormatter = [[NSDateFormatter alloc] init]; } } @end 在Swift中
@implementation MyClass
static NSDateFormatter *dateFormatter = nil;
+ (void) initialize {
if (self == [MyClass class]) {
dateFormatter = [[NSDateFormatter alloc] init];
}
}
@end
在Swift中,我们不再需要在两个不同的位置声明和初始化这个静态对象。我们可以做得很简单
let dateFormatter = NSDateFormatter()
在类作用域中,加载类时初始化日期格式化程序
我的问题:当用Swift写作时,有什么理由不使用这种新模式吗?仍然可以在模块范围内声明日期格式化程序,然后在
initialize
中对其进行初始化;这样分两步做有什么理由吗?没有,没有这样的理由;自我初始化变量是一种方法
更好的是,将其自初始化为一个被调用的闭包,并且可以在那里进一步初始化/配置日期格式化程序
不仅如此,如果你将它标记为
@lazy
,那么它甚至在你第一次真正访问它之前都不会被初始化。如果你在全局范围内声明变量(带有var),你就可以免费得到“lazy”的东西,就像苹果的文档中提到的那样(«全局常量和变量总是以与延迟存储属性类似的方式延迟计算。与延迟存储属性不同,全局常量和变量不需要用延迟属性标记。)@JeanLeMoignan Correct-a-mundo。我之所以提到@lazy
,只是因为他建议将这个变量放在类的顶层,而不是文件的顶层——我认为他这样做是正确的。