如何在macOS上用Swift读取com.apple.symbolichotkeys.plist文件?
解决Apple Symbolic HotKeys plist的Codable解析问题
你的代码解析失败有两个核心问题:
- 动态键映射错误:
AppleSymbolicHotKeys下的子键是动态数字(比如10、11),而非固定的someKey,不能用静态结构体属性匹配,需要用字典类型[Int: 对应结构体]来承接。 - 字段名不匹配:plist里的参数数组键是
parameters,但你代码里写成了parameter,导致解码时找不到对应字段。
修正后的完整代码
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 { let AppleSymbolicHotKeys: [Int: HotkeyProperty] } struct HotkeyProperty: Codable { let enabled: Bool let value: HotkeyValue } struct HotkeyValue: Codable { let parameters: [Int] let type: String } // 解码并处理错误 if let data = xml.data(using: .utf8) { let decoder = PropertyListDecoder() do { let hotkeys = try decoder.decode(Root.self, from: data) print("解码成功:", hotkeys) // 示例:检查ID为10的快捷键是否启用 if let hotkey10 = hotkeys.AppleSymbolicHotKeys[10] { print("快捷键10启用状态:", hotkey10.enabled) } } catch { print("解码失败,错误信息:", error) } }
关键改动说明
- 用
[Int: HotkeyProperty]替代原静态结构体,直接匹配动态数字键 - 拆分嵌套结构体为
HotkeyProperty和HotkeyValue,结构更清晰 - 修正属性名
parameters,与plist中的键完全匹配 - 用
do-catch替代try?,可以捕获具体解码错误,方便调试
内容的提问来源于stack exchange,提问作者soundflix
相关产品推荐
相关产品推荐

