【问题标题】:Obj-c code to Swift - NSDateFormatter [duplicate]Swift 的 Obj-c 代码 - NSDateFormatter [重复]
【发布时间】:2015-08-23 01:08:29
【问题描述】:

我正在尝试创建一个延迟加载且仅初始化一次的日期格式化程序。在 Swift 中,如果您在全局范围内创建一个变量,它会自动延迟加载,因此可以解决此问题。但是我如何以线程安全的方式只创建一次呢?我找到了这个 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 中重新创建它时遇到了麻烦,因为静态变量只能在类型上声明,而不能在计算属性或函数上声明。这是否意味着我只能将其重新创建为一个类?

编辑

我知道如何将单例创建为类,我更想知道是否有更简单的方法来使用单例(全局计算属性与类)。但转念一想,一个类可能会更好,而且它的单例实现非常简单。

【问题讨论】:

    标签: ios objective-c swift nsdateformatter


    【解决方案1】:

    我想类似的东西可以为你完成这项工作:

    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
    }()
    

    【讨论】:

    • ...或查看可能重复链接。我刚刚看到关于某人的 cmets 在我发布答案后已经在其他地方解决了这个问题。
    • 关于替代方案:每次调用计算属性时都会计算它们,不是吗?这意味着我每次都要重新初始化 NSDateFormatter,这是一项昂贵的操作。
    • lazy 属性在其生命周期内仅在第一次使用之前被初始化一次
    • lazy 表示它们在首次使用时被初始化,是的 - 仅此而已。我刚刚对其进行了测试,并且每次调用它们时都会重新计算计算属性,无论是否惰性(旁注:默认情况下全局属性是惰性的,因此在这种情况下不需要关键字)。无论如何,第二个选项将无效,因为它每次都会重新初始化 NSDateFormatter()
    • @itstrueimryan,我不确定你现在在说什么; lazy 属性在其生命周期中仅创建一次,每次访问该属性时,您都会返回第一次初始化的同一个实例 - 或者如果您愿意: NSDateFormatter 不会每次都被初始化,但显然如果你有一个多次实例化的类,每个单独的实例都有其lazy 属性的 自己的 实例。也许,这种情况会让你感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多