2014-06-08 59 views
4

在Objective-C中,类对于该类将多次使用的实例保留静态引用是很常见的。例如,声明和初始化类范围内的静态对象

@implementation MyClass 

static NSDateFormatter *dateFormatter = nil; 

+ (void) initialize { 
    if (self == [MyClass class]) { 
     dateFormatter = [[NSDateFormatter alloc] init]; 
    } 
} 

@end 

在Swift中我们不再需要在两个不同的地方声明和初始化这个静态对象。我们可以简单地做

let dateFormatter = NSDateFormatter() 

在类作用域和日期格式化程序初始化时,类加载。

我的问题:在Swift中编写时,是否有任何理由而不是使用这种新模式?它仍然可以在模块范围内声明日期格式化程序,然后在initialize之内初始化它;有没有什么理由像这样做两步?

回答

3

不,没有这样的理由;自我初始化变量是要走的路。

更好的是,自我初始化为一个被调用的闭包,日期格式化程序可以进一步初始化/配置,就在那里。

不仅如此,而且如果您将其标记为@lazy,那么在您第一次实际访问它之前,它甚至不会被初始化。

+0

如果在全局范围内声明变量(包含var),则可以免费获得“懒惰”的东西,如Apple的文档中所述(«全局常量和变量总是延迟计算,与Lazy Stored属性与延迟存储属性不同,全局常量和变量不需要使用lazy属性进行标记。) –

+0

@JeanLeMoignan更正一个mundo。我提到'@懒惰'只是因为他建议把这个变量放在类的顶层,而不是在文件的顶层 - 我认为他是正确的。 – matt