在Swift中创建NSDateFormatter?

约翰·波拉德

我是新手,并不熟悉Objective-C。有人可以帮我将其转换为Swift吗?我得到这个代码雷Wenderlich最好的iOS做法- http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks

您会将代码放在哪里?它将放入充满全局变量的类文件中吗?

- (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"; // twitter date format
    });
    return formatter;
}
  1. 如果您确实要寻找问题中方法的直接模拟,则可以执行以下操作:

    class MyObject {
    
        // define static variable
    
        private static let formatter: DateFormatter = {
            let formatter = DateFormatter()
            formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
            return formatter
        }()
    
        // you could use it like so
    
        func someMethod(date: Date) -> String {
            return MyObject.formatter.string(from: date)
        }
    }
    

    这些static属性像全局变量一样,享受dispatch_once其默认值的行为。有关更多信息,请参阅Apple的Swift博客dispatch_once中“文件和初始化”条目末尾讨论

  2. 关于日期格式化程序的最佳做法,我建议:

    • 是的,谨慎的做法是不要不必要地创建和销毁您可能再次需要的格式化程序。在WWDC 2012视频,iOS App Performance:Responsiveness中,Apple明确鼓励我们

      • 每个日期格式缓存一个格式化程序;

      • NSLocale.currentLocaleDidChangeNotification通过添加观察器NotificationCenter,并在发生这种情况时清除/重置缓存的格式化程序;

      • 请注意,重置格式与重新创建一样昂贵,因此请避免重复更改格式化程序的格式字符串。
         

      最重要的是,如果您重复使用相同的日期格式,请尽可能重用日期格式。

    • 如果DateFormatter用于解析要与Web服务交换(或存储在数据库中)的日期字符串,则应使用en_US_POSIX语言环境来避免可能不使用公历的国际用户遇到的问题。请参阅Apple技术问答#1480DateFormatter文档中的“使用固定格式的日期表示形式”讨论(或在iOS 10和macOS 10.12中,使用ISO8601DateFormatter。)

      但是当dateFormat与with一起DateFormatter使用,请使用当前语言环境来创建要呈现给最终用户的字符串,而en_US_POSIX在创建/解析要在应用程序内部使用或与Web服务交换的字符串时,请使用local。

    • 如果要格式化用户界面的日期字符串,dateFormat请尽可能避免使用字符串文字来本地化字符串在可能的地方使用dateStyle使用timeStyle而且,如果必须使用custom dateFormat,请使用模板来本地化字符串。例如,E, MMM d您可以使用dateFormat(fromTemplate:options:locale:)而不是在Swift 3和更高版本中进行硬编码

      formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "EdMMM", options: 0, locale: Locale.current)
      

      例如,美国用户将自动显示“ 9月5日星期一”,英国用户将自动显示“ 9月5日星期一”。

    • DateFormatter现在在iOS 7及更高版本,并在Mac OS 10.9和更高版本上运行64位应用程序线程安全的。

对于Swift 2示例,请参见此答案的先前版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章