gpt4 book ai didi

swift - 在 Swift 中将字典映射到结构体数组

转载 作者:行者123 更新时间:2023-11-30 10:51:50 24 4
gpt4 key购买 nike

我的应用需要表示一组预设,其中预设由以下结构表示:

struct Preset: Codable {
var name: String
var value: Int
}

使用 NSUserDefaultsControllerNSTableView 和 CocoaBindings,我能够创建一个“首选项”窗口,在其中可以添加和删除预设以及编辑它们。它们被保存到 UserDefaults plist 中,如下所示:

<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>

我希望使用自然表示法在我的代码中访问这些数据。基本上,我想要一个具有如下计算属性的设置单例:

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
}
}
}

getter 中的代码应执行从 preset UserDefaults 数组到 [Preset] 的映射,以代替 //这里缺少代码 注释。这是我想使用的符号示例:

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

但是我对这个解决方案并不满意。是否有更紧凑和通用的解决方案(适用于类似上下文中的任何结构,而无需对结构属性名称进行硬编码,例如 namevalue)?

最佳答案

您可以使用PropertyListDecoder直接解码您的属性列表文件:

struct Preset: Codable {
var name: String
var value: Int
}

struct Presets : Codable {
let presets: [Preset]
}

let decoder = PropertyListDecoder()
let presets = try? decoder.decode(Presets.self, from: yourPropertyListData)

关于swift - 在 Swift 中将字典映射到结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54381536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com