Значение типа ‘[Перспектива]’ не имеет элемента ‘Total1, Total2 или Total3’

#swift

#swift

Вопрос:

При запуске я хотел бы прочитать данные из UserDefaults, если таковые имеются, иначе инициализировать данные. Я получаю ошибки при попытке инициализировать мои данные, когда в UserDefaults нет данных, сохраненных. Я пробовал итоги.Total1 = 0.0 и self.итоговые значения.Total1 = 0.0 оба выдают ошибку ‘значение типа [Перспектива] не имеет элемента 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
    }
}
   
  

Комментарии:

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

Ответ №1:

Ваше totals свойство представляет собой массив, а не отдельный экземпляр Prospect .

Если вы хотите, чтобы totals свойство содержало единицу Prospect , когда вы не можете загрузить его из UserDefaults , вы можете сделать это:

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

Если вы просто хотите, чтобы 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() {
        totals = UserDefaults.standard
            .data(forKey: Self.saveKey)
            .flatMap { try? JSONDecoder().decode([Prospect].self, from: $0) }
            ?? []
    }
  

Комментарии:

1. Последние 2 работают нормально. Спасибо, я все еще не понимаю, как индексировать итоги моего массива. Допустим, я использую: @ObservedObject var prospects = Перспективы() в contentView. Казалось бы, я мог бы получить доступ к своим итоговым данным, используя что-то вроде prospects.totals[]. Total1 = 25,00, но я, похоже, в сорняках.