首页 > 解决方案 > 如果它们是通过加载 .json 数据进行初始化的,如何在 init() 中初始化变量?

问题描述

我有一个结构 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() 变量都将通过与 PrimaryUser() 完全分离的解析器使用 .json 文件中的数据进行初始化。所以在 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)!
    }
}

标签: iosjsonswiftstruct

解决方案


你可以像这样发起懒惰

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
    }()
}

推荐阅读