gpt4 book ai didi

swift - 如何在 Swift 类扩展中创建 'static'?

转载 作者:可可西里 更新时间:2023-11-01 00:37:09 29 4
gpt4 key购买 nike

在这里的几个地方,有人建议在 NSDate 的扩展中使用计算属性可能是通过 NSDateFormatter 获取日期的字符串版本的好方法>,像这样:

extension NSDate {
public var UTC : String {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
formatter.timeZone = NSTimeZone(abbreviation: "UTC")
return formatter.stringFromDate(self)
}
}

但是,分配一个 NSDateFormatter 的开销很大,建议只创建一次并缓存起来。每次格式化日期时,上面的代码都会创建 NSDateFormatter,我想知道是否有一种方法可以在扩展内部创建 NSDateFormatter 以供重用?

显然,我可以在扩展之外只创建一次,但这似乎破坏了类的封装性。

我想起了:https://xkcd.com/1179/ !!

最佳答案

您可以像在类上一样将静态成员添加到类扩展中。使用时需要在类名前加上静态成员名的前缀,例如NSDate.dateFormatterUTC,即使您在同一个类中使用它也是如此。

这个有效:

extension NSDate {
private static let dateFormatterUTC: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
formatter.timeZone = NSTimeZone(abbreviation: "UTC")
return formatter
}()

public var UTC : String {
return NSDate.dateFormatterUTC.stringFromDate(self)
}
}

使用私有(private)常量也不是世界上最糟糕的事情:

private let dateFormatterUTC: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
formatter.timeZone = NSTimeZone(abbreviation: "UTC")
return formatter
}()

extension NSDate {
public var UTC : String {
return dateFormatterUTC.stringFromDate(self)
}
}

这并不比静态类成员差多少,因为 Swift 的 privatefile-private,而不是 type-privatedateFormatterUTC 的这两个声明具有相同的范围。即使在第一个示例中,NSDate.dateFormatterUTC 也可以在声明它的整个文件中访问。

我同意静态版本更可取,但仅出于风格原因:我喜欢它紧挨着使用它的东西缩进的方式。

作为Gwendal wisely notes above ,这种方法假设 UTC 只会从一个线程调用。虽然 static let 和全局 let 在 Swift 中都是线程安全的,但是 NSDateFormatter 类不是! 看起来像it’s threadsafe starting in iOS 7 .呸。

不过,在提到任何单例时,始终保持线程安全警告总是好的。如果您确实想在多个线程中使用非线程安全的帮助器对象,请考虑在每次调用时创建一个新的帮助器,或者使用 NSThread.currentThread().threadDictionary 创建一个线程实例。在选择更复杂的线程本地选项之前,请务必进行一些分析以确保您确实在解决性能问题。

关于swift - 如何在 Swift 类扩展中创建 'static'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33602923/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com