Предположим, что словарь хранится в UserDefaults в соответствии со следующим кодом:
UserDefaults.standard.set(["name": "A preset", "value": 1], forKey: "preset")
Результат выполнения этой команды:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>preset</key>
<dict>
<key>name</key>
<string>A preset</string>
<key>value</key>
<integer>1</integer>
</dict>
</dict>
</plist>
Теперь рассмотрим эти данныебыть представленным следующей структурой:
struct Preset: Codable {
var name: String
var value: Int
}
Я хотел бы вызвать следующий код и получить те же результаты, что и выше (данные, сохраненные в листе, используя точно такой же макет):
UserDefaults.standard.set(Preset(name: "A preset", value: 1), forKey: "preset")
К сожалению, это приводит к ошибке:
Attempt to set a non-property-list object
TableViewToUserDefaults.Preset(name: "A preset", value: 1)
as an NSUserDefaults/CFPreferences value for key preset
Как мне этого добиться, сохранив тот же макет plist, и, если возможно, общим способом?(то есть тот, который работает для любой структуры, состоящей из свойств, которые могут быть закодированы в plist, без жесткого кодирования свойств структуры, таких как name
и value
в данном случае)