Ответ 1
-
Если вы действительно ищете прямой аналог метода в своем вопросе, в Swift 3 вы можете сделать что-то вроде:
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) } }
Или в Swift 2:
class MyObject { // define static variable private static let formatter: NSDateFormatter = { let formatter = NSDateFormatter() formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy" return formatter }() // you could use it like so func someMethod(date: NSDate) -> String { return MyObject.formatter.stringFromDate(date) } }
Свойства
static
, такие как глобальные, имеют поведениеdispatch_once
для значений по умолчанию. Для получения дополнительной информации см. Обсуждениеdispatch_once
в конце записи Файлы и инициализация в блоге Apple Swift. -
Что касается лучших практик в форматах даты, я бы предложил:
-
Да, разумно не излишне создавать и уничтожать форматировщики, которые вам, скорее всего, понадобятся. В видеоролике WWDC 2012 Производительность приложений iOS: отзывчивость Apple явно поощряет нас к
-
Кэш одного формата для формата даты,
-
Добавить наблюдателя для
NSLocale.currentLocaleDidChangeNotification
в Swift 3 (NSCurrentLocaleDidChangeNotification
в Swift 2) черезNSNotificationCenter
и очистить/сбросить кешированные форматиры, если это произойдет; и -
Обратите внимание, что сброс формата столь же дорог, как и воссоздание, поэтому избегайте многократного изменения формата форматирования.
Нижняя строка, повторное использование даты, когда это возможно, если вы используете один и тот же формат даты несколько раз.
-
-
Если вы используете
NSDateFormatter
для синтаксического анализа строк даты, которые должны быть обменены с веб-службой (или сохранены в базе данных), вы должны использовать локальen_US_POSIX
, чтобы избежать проблем с международными пользователями, которые не могут использовать григорианские календари, См. Apple Technical Q & A # 1480. (Или в iOS 10 и macOS 10.12 используйтеISO8601DateFormatter
.)Но при использовании
dateFormat
сNSDateFormatter
/DateFormatter
используйте текущий язык для создания строк, которые будут представлены конечному пользователю, но используйтеen_US_POSIX
local при создании/синтаксическом анализе строк, которые будут использоваться внутри внутри приложения или для обмена с веб-службой. -
Если строки даты форматирования для пользовательского интерфейса, локализуйте строки, избегая при этом использовать строковые литералы для
dateFormat
, если это возможно. ИспользуйтеdateStyle
иtimeStyle
, где можете. И если вы должны использовать пользовательскийdateFormat
, используйте шаблоны для локализации ваших строк. Например, вместо строчного кодированияE, MMM d
в Swift 3 вы должны использоватьdateFormat(fromTemplate:options:locale:)
:formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "EdMMM", options: 0, locale: Locale.current)
Или в Swift 2,
dateFormatFromTemplate(_:options:locale:)
:formatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("EdMMM", options: 0, locale: NSLocale.currentLocale())
Это автоматически отобразит, например, "Mon, Sep 5" для пользователей США, но "Mon 5 Sep" для пользователей Великобритании.
-
NSDateFormatter
теперь потокобезопасен для iOS 7 и более поздних версий и 64-разрядных приложений, работающих на macOS 10.9 и более поздних версиях.
-