Swift 的 Obj-c 代码 - NSDateFormatter [重复]

Posted

技术标签:

【中文标题】Swift 的 Obj-c 代码 - NSDateFormatter [重复]【英文标题】:Obj-c code to Swift - NSDateFormatter [duplicate] 【发布时间】: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 中重新创建它时遇到了麻烦,因为静态变量只能在类型上声明,而不能在计算属性或函数上声明。这是否意味着我只能将其重新创建为一个类?

编辑

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

【问题讨论】:

【参考方案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 属性的 自己的 实例。也许,这种情况会让你感到困惑。

以上是关于Swift 的 Obj-c 代码 - NSDateFormatter [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:链式 UIView 动画永远重复? Obj-C 代码不可移植

在 Swift 中使用 Obj-C 类扩展?

在 Swift 中使用 Obj-C 类扩展?

防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

sonarqube 混合 obj-c swift 项目,如何扫描代码覆盖率

Obj-C 到 Swift 的转换(包括 Cocoapods)