Obj中的静态与Swift中的静态

时间:2016-11-30 20:29:44

标签: ios objective-c swift

我试图仅为该类实例化一次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
}

3 个答案:

答案 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
    }      
}