日期总是在同一时间返回

Cod*_*ess 2 date swift

我有一个扩展设置,String以相同的格式返回当前日期,以便可以调用代码中的任何位置并使用相同的格式,从而保持一致性.我的代码是

extension String {
    static let dateString = DateFormatter.localizedString(from: Date(), dateStyle: .short, timeStyle: .short)
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,当我调用它时,返回相同的确切时间,直到应用程序被杀死.如果我正在使用Date()那么它每次都应该使用新的价值,对吧?为什么不是这样?

Mar*_*n R 6

(静态)存储属性仅初始化一次(在第一次访问时).比较"Swift编程语言"中的属性:

存储类型属性在首次访问时会被初始化.它们保证只初始化一次,即使同时由多个线程访问,也不需要使用延迟修饰符进行标记.

你想要的是一个计算属性:

extension String {
    static var dateString: String {
        return DateFormatter.localizedString(from: Date(), dateStyle: .short, timeStyle: .short)
    }
}
Run Code Online (Sandbox Code Playgroud)

备注:正如Leo Dabus所说,作为一个实例属性更有意义Date.以下是从NSDate()或Date()中获取的示例,显示错误的时间:

extension Date {
    func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
        return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • IMO字符串应该从属性名称中省略,并且作为`Date`上的实例属性扩展更有意义. (2认同)