Мое приложение должно представлять массив предустановок, где предустановка представлена следующей структурой:
struct Preset: Codable {
var name: String
var value: Int
}
Используя NSUserDefaultsController
, NSTableView
и CocoaBindings, я смог создать окно настроек, где я могу добавлять и удалять пресеты, а также редактировать их. Они сохраняются в списке UserDefaults
следующим образом:
<plist version="1.0">
<dict>
<key>presets</key>
<array>
<dict>
<key>name</key>
<string>A preset</string>
<key>value</key>
<integer>1</integer>
</dict>
<dict>
<key>name</key>
<string>Another preset</string>
<key>value</key>
<integer>2</integer>
</dict>
</array>
</dict>
</plist>
Я ищу доступ к этим данным в моем коде, используя естественную запись. По сути, я хотел бы иметь синглтон Settings с вычисляемым свойством, подобным этому:
class Settings: NSObject {
static let sharedInstance = Settings()
private let presetsKey = "presets"
override private init() {
UserDefaults.standard.register(defaults: [
presetsKey: [ ["name": "Default preset", "value": 0] ],
])
super.init()
}
var presets: [Preset] {
get {
// Missing code goes here
}
}
}
Код в получателе должен выполнить преобразование из массива preset
UserDefaults
в [Preset]
вместо комментария // Missing code goes here
. Вот пример обозначения, которое я хотел бы использовать:
let firstPresetName = Settings.sharedValue.preset[0].name
let firstPresetValue = Settings.sharedValue.preset[0].value
print("The first preset's name is \(firstPresetName\) and its value is \(firstPresetValue\)")
Я написал это, и это работает:
let presets = UserDefaults.standard.array(forKey: presetsKey) as! [[String: Any]]
var result = [Preset]()
for preset in presets {
result.append(ControlParameters(name:preset["name"] as! String, value:preset["value"] as! Int))
}
return result
И все же я не доволен этим решением. Существует ли более компактное и универсальное решение (которое работает для любой структуры в аналогичном контексте, без необходимости жестко кодировать имена свойств структуры, такие как name
и value
)?