Как мне обойтись без инициализации переменных внутри init (), если они инициализируются загрузкой. json data? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть структура PrimaryUser (), переменные которой загружаются через анализатор файлов. json. Одна из этих переменных - строка даты в формате ISO8601. Я хочу, чтобы это значение автоматически преобразовывалось в переменную типа Date.

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как заставить этот код запускаться автоматически при создании PrimaryUser ():

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
        self.dateOfBirth = dateFormatter.date(from: dateOfBirthISO8601)!

Если я помещу этот код в init (), я получаю сообщение об ошибке:

'self' used before all stored properties are initialized

Если я попытаюсь сделать dateOfBirth ленивой переменной, я столкнусь с этой ошибкой:

Lazy properties must have an initializer

Еще раз повторяю, все переменные PrimaryUser () будут инициализированы данными из файла. json через синтаксический анализатор, который полностью отделен от PrimaryUser (). Так что нет смысла инициализировать переменные внутри PrimaryUser ().

Вот как выглядит PrimaryUser ():

import Foundation
import SwiftUI

struct PrimaryUser: User, Hashable, Codable, Identifiable {
    var id: Int
    var firstName: String
    var lastName: String
    var dateOfBirthISO8601: String
    lazy var dateOfBirth: Date
    init() {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
        self.dateOfBirth = dateFormatter.date(from: dateOfBirthISO8601)!
    }
}

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы можете запустить ленивый как это

struct PrimaryUser:  Hashable, Codable, Identifiable {
    var id: Int
    var firstName: String
    var lastName: String
    var dateOfBirthISO8601: String
    lazy var dateOfBirth: Date? = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
        let date  = dateFormatter.date(from: dateOfBirthISO8601)
        return date
    }()
}
0 голосов
/ 30 мая 2020

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

Просто передайте DateFormatter в JSONDecoder с помощью:

decoder.dateDecodingStrategy = .formatted(dateFormatter)

Таким образом вы можете избавиться от ленивой переменной или пользовательского инициализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...