我试图仅为该类实例化一次DateFormatter,因此我不会为每个实例浪费大量的计算时间。在Obj-C中,我懒惰地实例化一个静态属性来完成此任务。我试图弄清楚如何在Swift中做到这一点,我读过的大多数解释都没有完全回答这个问题。
在Obj-C中:
- (NSDateFormatter *)dateFormatter {
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateStyle = NSDateFormatterMediumStyle;
}
return dateFormatter;
}
快速翻译?
static var dateFormatter: DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
return dateFormatter
}
答案 0 :(得分:3)
您需要在类级别声明静态变量:
class MyClass {
static var dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = DateFormatter.Style.medium
return dateFormatter
}()
}
答案 1 :(得分:2)
在Swift中不使用self
的惰性初始化静态常量是
static let dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
return dateFormatter
}()
与实例属性相同的代码(没有static
)也是常量,但不会被懒惰地初始化。
然而,ObjC代码中的static
关键字有点误导。与ObjC代码相当的1:1是
lazy var dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
return dateFormatter
}()
该变量被懒惰地初始化,但是实例属性。
答案 2 :(得分:0)
除了@CodeDifferent的回答之外,您可能希望将静态包装在class var
中,因为这将允许您覆盖子类中的日期格式化程序:
class MyClass {
fileprivate static let mediumDateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
return dateFormatter
}()
class var dateFormatter: DateFormatter {
return mediumDateFormatter
}
}
class MyOtherClass: MyClass {
fileprivate static let shortDateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .short
return dateFormatter
}()
override class var dateFormatter: DateFormatter {
return shortDateFormatter
}
}