Ленивая собственность в 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
в связанный класс модели представления и используйте его из соответствующего экземпляра.