You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在macOS上用Swift读取com.apple.symbolichotkeys.plist文件?

解决Apple Symbolic HotKeys plist的Codable解析问题

你的代码解析失败有两个核心问题:

  1. 动态键映射错误:AppleSymbolicHotKeys下的子键是动态数字(比如10、11),而非固定的someKey,不能用静态结构体属性匹配,需要用字典类型[Int: 对应结构体]来承接。
  2. 字段名不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:30:54