Ленивая собственность в SwiftUI

Привет, мне нужна помощь в создании ленивой собственности.

У меня есть такой код:

lazy var dateFormat: DateFormatter =
{
    let formatter = DateFormatter()
    formatter.locale = NSLocale.current
    formatter.dateFormat = "dd/MM/YYYY hh:mm"
    return formatter
}()

И при использовании в Text(date, formatter:self.dateFormat)

Я получаю эту ошибку Cannot use mutating getter on immutable value: 'self' is immutable

3 ответа

Вы можете использовать static вместо lazy.

struct Formatter: View {

    var date = Date()

    private static var dateFormat: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = NSLocale.current
        formatter.dateFormat = "dd/MM/YYYY hh:mm"
        return formatter
    }()

    var body: some View {
        Text("\(date, formatter: Self.dateFormat)")
    }
}

Ответы об использовании средства форматирования даты в SwiftUI не ошибочны, но ни один из них не обрабатывает локализованный формат даты правильно. Если вы не собираетесь использовать какой-либо из предопределенных форматов даты, вам следует использоватьDateFormatter функция экземпляра setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String).

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

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

Вы не можете использовать lazy в представлении SwiftUI, если вы хотите, в этом конкретном случае можно использовать статический, как в примере ниже

struct TestView: View {
    static var dateFormat: DateFormatter =
    {
        let formatter = DateFormatter()
        formatter.locale = NSLocale.current
        formatter.dateFormat = "dd/MM/YYYY hh:mm"
        return formatter
    }()

    // ... other code

    // use as TestView.dateFormat

в качестве альтернативы вы можете двигаться lazy var dateFormat в связанный класс модели представления и используйте его из соответствующего экземпляра.

Другие вопросы по тегам