UserDefaults
не может сохранить тип SwiftyJSON JSON
.Вы должны сохранить некоторый тип, который они поддерживают, в этом случае вы ищете Data
.
В любом случае, для сохранения Data
в UserDefaults
не лучший вариант, и вы должны сохранить Data
в файл в другом месте.Чтобы достичь этого, вы можете использовать FileManager
.
Итак, создайте пользовательскую модель для ваших данных вместо использования JSON
и перенесите Codable
в свою пользовательскую модель
struct Model: Codable {
var marked, correct, subject, question, answer, time, score, chapter: Int
var attempted, status: Bool
}
Затем вы должны использовать этот Model
как тип элемента внутри вашего массива (обратите внимание, что тогда вам нужно будет декодировать ваш ответ из Data
, используя JSONDecoder
(см. Ниже))
var finalArray = [Model]()
затем вы можете использовать JSONEncoder
для кодирования массива моделей в Data
, который вы можете записать в некоторый файл
do {
let encoded = try JSONEncoder().encode(finalArray)
let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
try encoded.write(to: fileURL)
} catch { print(error) }
и JSONDecoder
для декодирования Data
из сохраненного файла
do {
let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
if let data = try? Data(contentsOf: fileURL) {
let decoded = try JSONDecoder().decode([Model].self, from: data)
}
} catch { print(error) }