Swift 类型为'的值;[前景]';没有成员';Total1、Total2或Total3';

Swift 类型为'的值;[前景]';没有成员';Total1、Total2或Total3';,swift,Swift,在启动时,我希望从UserDefaults(如果可用)读取数据,或者初始化数据。当UserDefaults中没有存储数据时,尝试初始化数据时出错。我尝试了totals.Total1=0.0和self.totals.Total1=0.0,这两种方法都产生了[Prospect]类型的错误值,但没有成功的成员Total1。我错过了什么 class Prospect: Codable { var Total1: Double var Total2: Double var Tota

在启动时,我希望从UserDefaults(如果可用)读取数据,或者初始化数据。当UserDefaults中没有存储数据时,尝试初始化数据时出错。我尝试了totals.Total1=0.0和self.totals.Total1=0.0,这两种方法都产生了[Prospect]类型的错误值,但没有成功的成员Total1。我错过了什么

class Prospect: Codable {
    var Total1: Double
    var Total2: Double
    var Total3: Double
}

class Prospects: ObservableObject {
    @Published var totals: [Prospect]
    static let saveKey = "SavedData"
    
    init() {
        if let data = UserDefaults.standard.data(forKey: Self.saveKey) {
            if let decoded = try? JSONDecoder().decode([Prospect].self, from: data) {
                self.totals = decoded
                return
            }
        }
        totals.Total1 = 0.0
        totals.Total2 = 0.0
        totals.Total3 = 0.0
    }
}
   

您的
totals
属性是一个数组,而不是
Prospect
的单个实例

如果在无法从
UserDefaults
加载时,希望
totals
属性包含单个
Prospect
,可以执行以下操作:

    init() {
        if let data = UserDefaults.standard.data(forKey: Self.saveKey) {
            if let decoded = try? JSONDecoder().decode([Prospect].self, from: data) {
                self.totals = decoded
                return
            }
        }

        totals = [.init(Total1: 0, Total2: 0, Total3: 0)]
    }
    init() {
        if let data = UserDefaults.standard.data(forKey: Self.saveKey) {
            if let decoded = try? JSONDecoder().decode([Prospect].self, from: data) {
                self.totals = decoded
                return
            }
        }

        totals = []
    }
如果只希望
totals
属性为空,可以执行以下操作:

    init() {
        if let data = UserDefaults.standard.data(forKey: Self.saveKey) {
            if let decoded = try? JSONDecoder().decode([Prospect].self, from: data) {
                self.totals = decoded
                return
            }
        }

        totals = [.init(Total1: 0, Total2: 0, Total3: 0)]
    }
    init() {
        if let data = UserDefaults.standard.data(forKey: Self.saveKey) {
            if let decoded = try? JSONDecoder().decode([Prospect].self, from: data) {
                self.totals = decoded
                return
            }
        }

        totals = []
    }
你也可以像这样收紧整个方法:

    init() {
        totals = UserDefaults.standard
            .data(forKey: Self.saveKey)
            .flatMap { try? JSONDecoder().decode([Prospect].self, from: $0) }
            ?? []
    }

totals
是一个数组。您可能需要先访问它的元素。后两个可以。谢谢,我还不清楚如何索引到我的数组总数中。假设我在ContentView中使用:@ObservedObject var prospects=prospects()。似乎我可以使用prospects.totals[].Total1=25.00之类的东西来访问我的总数,但我似乎处于困境。