Включить функцию преобразования даты в расширение DateFormatter - PullRequest
1 голос
/ 23 марта 2019

Расширение форматирует дату API, затем функция конвертера преобразует ее в формат, который мне нравится.

Код работает, но вызов кажется многословным.Это что-то, что может быть реорганизовано?Могу ли я объединить два?

Казалось бы логичным сделать свойство DateFormatter convertDateFormater свойством iso8601Full.Ошибок не было, но попытка звонка не сработала.

Пожалуйста, напишите ответ с кодом, чтобы я мог пометить его правильно.

extension DateFormatter {
    static let iso8601Full: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}

    func convertDateFormater(date: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = dateFormatter.date(from: date)
        dateFormatter.dateFormat = "dd/MM/yyyy"
        return  dateFormatter.string(from: date!)
    }

call

row.creationDateLabel.setText("\(convertDateFormater(date: DateFormatter.iso8601Full.string(from: value.creationDate)))")

1 Ответ

1 голос
/ 24 марта 2019

Вы создаете форматеры даты внутри вашего метода, что может быть дорого. Возможно, вы захотите сохранить оба в static:

extension DateFormatter {
    static let iso8601Full: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()

    static let dateOnly: DateFormatter = {
         let formatter = DateFormatter()
         formatter.dateFormat = "dd/MM/yyyy"
         return formatter
    }()

    static func string(iso string: String) -> String {
        let date = DateFormatter.iso8601Full.date(from: string)!
        return  DateFormatter.dateOnly.string(from: date)
    }
}

И тогда вы можете сделать:

row.creationDateLabel.setText(DateFormatter.string(iso: value.creationDate))

Это более кратко и позволяет избежать избыточного создания экземпляров форматеров.

Лично, вместо использования dateFormat внутри dateOnly, я бы использовал dateStyle, поэтому строка даты (предположительно показанная в пользовательском интерфейсе) правильно локализована, но вы можете делать все, что захотите.

(Кстати, я набрал это на своем телефоне, поэтому я прошу прощения, если есть какие-либо синтаксические ошибки, но, надеюсь, это иллюстрирует основную идею.)


Если creationDate уже является Date, вам не нужно ничего из этого специфичного для iso материала. Я основывал свой ответ на вашем методе, который в качестве параметра принимал String. Если это уже Date, то просто:

row.creationDateLabel.setText(DateFormatter.dateOnly.string(from: value.creationDate))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...