关于ios:Swift的Obj-c代码 – NSDateFormatter

Obj-c code to Swift - NSDateFormatter

本问题已经有最佳答案,请猛点这里访问。

我正在尝试创建一个日期格式化程序,它惰性地加载并只初始化一次。在swift中,如果您全局创建一个变量,它会自动延迟加载,这样就可以得到处理。但是,如何以线程安全的方式只创建一次呢?我发现了这个OBJ-C代码:

1
2
3
4
5
6
7
8
9
(NSDateFormatter *)formatter {
  static NSDateFormatter *formatter;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _formatter = [[NSDateFormatter alloc] init];
    _formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
  });
  return formatter;
}

但是我很难用swift重新创建它,因为静态变量只能在类型上声明,而不能在计算属性或函数上声明。这是否意味着我只能将其作为类重新创建?

编辑

我知道如何创建一个singleton类,我更想知道是否有一种更简单的方法来使用singleton(全局计算属性vs类)。但第二种想法是,类可能更好,它的单例实现非常简单。


我想类似的事情也能帮你做到:

1
2
3
4
5
6
7
8
9
10
11
func formatter() -> NSDateFormatter! {
    struct myStatic  {
        static var dateFormatter: NSDateFormatter? = nil
        static var token: dispatch_once_t = 0;
    }
    dispatch_once(&myStatic.token) {
        myStatic.dateFormatter = NSDateFormatter();
        myStatic.dateFormatter?.dateFormat ="EEE MMM dd HH:mm:ss Z yyyy"
    }
    return myStatic.dateFormatter;
}

或者:

1
2
3
4
5
lazy var formatter: NSDateFormatter = {
    let dateFormatter: NSDateFormatter = NSDateFormatter()
    dateFormatter.dateFormat ="EEE MMM dd HH:mm:ss Z yyyy"
    return dateFormatter
}()