Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在类作用域中声明和初始化静态对象_Swift - Fatal编程技术网

Swift 在类作用域中声明和初始化静态对象

Swift 在类作用域中声明和初始化静态对象,swift,Swift,在Objective-C中,一个类通常会保留对该类将多次使用的实例的静态引用。比如说, @implementation MyClass static NSDateFormatter *dateFormatter = nil; + (void) initialize { if (self == [MyClass class]) { dateFormatter = [[NSDateFormatter alloc] init]; } } @end 在Swift中

在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
中对其进行初始化;这样分两步做有什么理由吗?

没有,没有这样的理由;自我初始化变量是一种方法

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


不仅如此,如果你将它标记为
@lazy
,那么它甚至在你第一次真正访问它之前都不会被初始化。

如果你在全局范围内声明变量(带有var),你就可以免费得到“lazy”的东西,就像苹果的文档中提到的那样(«全局常量和变量总是以与延迟存储属性类似的方式延迟计算。与延迟存储属性不同,全局常量和变量不需要用延迟属性标记。)@JeanLeMoignan Correct-a-mundo。我之所以提到
@lazy
,只是因为他建议将这个变量放在类的顶层,而不是文件的顶层——我认为他这样做是正确的。