Я нашел решение, но мне пришлось пойти по другому пути. Надеюсь, это поможет кому-то еще, кому нужно использовать коллекцию, соответствующую Codable и ObservableObject, для сохранения в Apps documentDirectory.
Я согласовал структуру 'Item' с Codable (то есть не с классом 'ManyItem'). Я добавил код для кодирования JSON и сохранения коллекции в каталог документов приложений. Это происходит автоматически c при изменении значения свойства. Класс инициируется либо путем чтения / декодирования файла JSON из каталога документов приложений, либо как новый пустой экземпляр, если файл JSON еще недоступен.
struct Item: Identifiable, Codable {
var id = UUID()
var one: String
}
class ManyItems: ObservableObject {
@Published var manyitems: [Item] {
didSet {
// Saves the array 'items' to disc
do {
// find the documentDirectory and create an URL for the JSON
file
let filename = getDocumentsDirectory().appendingPathComponent("manyitems.json")
let data = try JSONEncoder().encode(self.manyitems)
try data.write(to: filename, options: [.atomicWrite])
} catch {
print("Unable to save data.")
}
}
}
init() {
// replaces a call to 'getDocumentsDirectory()' methode as it created an initialisation error.
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
// Add the first [0] path to the filename and create 'filename'
let filename = paths[0].appendingPathComponent("manyitems.json")
//print(filename)
do {
// Try to read the file (if it exist) and load the data into the array 'manyitem'
let data = try Data(contentsOf: filename)
manyitems = try JSONDecoder().decode([Item].self, from: data)
// Yes all good then exit
return
} catch {
// Something whent wrong. Initialize by creating an empty array 'manyitems'
self.manyitems = []
print("Unable to load saved data.")
}
}
// retreives the App's first DocumentDirectory
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
}