Swift的Obj-c代码 - NSDateFormatter

时间:2015-06-08 14:05:26

标签: ios objective-c swift nsdateformatter

我正在尝试创建一个延迟加载的日期格式化程序,并且只初始化一次。在Swift中,如果你全局创建一个变量,它会自动加载lazilly,因此需要处理。但是,我如何才能以线程安全的方式创建一次?我发现了这个obj-c代码:

(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中重新创建它时遇到了麻烦,因为静态变量只能在类型上声明,而不能在计算属性或函数上声明。这是否意味着我只能将其重新创建为一个类?

修改

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

1 个答案:

答案 0 :(得分:2)

我想类似的东西可以帮到你:

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;
}

或者:

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