如何在 macOS 上使用 Swift 读取 com.apple.symbolichotkeys.plist

问题描述 投票:0回答:1

我正在尝试读取一个值

~/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
在我的模型中无法工作,因为每个“键”都有一个新的数值,但我怎样才能使其工作?

swift plist codable
1个回答
0
投票

这就是在 @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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.