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 代码不可移植
防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法