#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, но я, похоже, в сорняках.