我正在尝试读取一个值
~/Library/Preferences/com.apple.symbolichotkeys.plist
查看是否启用了某些热键。 我尝试使用 Codable 读取 plist 文件:
import Foundation
let xml = """
<?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>AppleSymbolicHotKeys</key>
<dict>
<key>10</key>
<dict>
<key>enabled</key>
<true/>
<key>value</key>
<dict>
<key>parameters</key>
<array>
<integer>65535</integer>
<integer>96</integer>
<integer>8650752</integer>
</array>
<key>type</key>
<string>standard</string>
</dict>
</dict>
<key>11</key>
<dict>
<key>enabled</key>
<true/>
<key>value</key>
<dict>
<key>parameters</key>
<array>
<integer>65535</integer>
<integer>97</integer>
<integer>8650752</integer>
</array>
<key>type</key>
<string>standard</string>
</dict>
</dict>
</dict>
</dict>
</plist>
"""
struct Root: Codable {
var AppleSymbolicHotKeys: Hotkey
struct Hotkey: Codable {
var someKey: Property // << key is an integer, not a static key!
struct Property: Codable {
var enabled: Bool
var value: Value
struct Value: Codable {
var parameter: [Int]
var type: String
}
}
}
}
if let data = xml.data(using: .utf8) {
let decoder = PropertyListDecoder()
let hotkeys = try? decoder.decode(Root.self, from: data)
print("Decoded:", hotkeys)
}
在我的 Playground 中,它返回:
Decoded: nil
上面的代码中,我复制了一部分xml内容以供参考。我也尝试读取真实文件,它返回数据但不解码。
我知道
someKey
在我的模型中无法工作,因为每个“键”都有一个新的数值,但我怎样才能使其工作?
这就是在 @vadian 的建议之后工作结构模型的样子:
struct Root: Codable {
var AppleSymbolicHotKeys: [String: Property]
struct Property: Codable {
var enabled: Bool
var value: Value
struct Value: Codable {
var parameters: [Int]
var type: String
}
}
}