使用循环从plist的根级别获取字典并将其放入变量

(发布标题后,它是字典数组而不是字典的字典)

我在Root词典中有很多字典的.plist。所有词典都有相同的键(“图像”和“文本”)。

如何从.plist中获取键和值,以将其放入字典字典这样的变量中(具有更多项,例如最多100张图像和文本),如下所示?

var imageTextDict = [[“” image“:” 1-image“,” text“:” 1的文本“],[” image“:” 2-image“,” text“:” 2的文本“] ,[“ image”:“ 3-image”,“ text”:“ 3的文本”],[“ image”:“ 4-image”,“ text”:“ 4的文本”]]

我发现的大多数代码都很老或没有回答我的问题...我能得到的最接近的代码是打印Root词典中特定词典的键和值,而不是Root的完整列表。

.plist中的(Key)Root,(Type)Dictionary,(Value)例如100件(我的声誉不到10件,因此无法上传图片)。

.plist作为源代码

<?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>1</key>
        <dict>
            <key>image</key>
            <string>1-image</string>
            <key>text</key>
            <string>Text for 1</string>
        </dict>
        <key>2</key>
        <dict>
            <key>image</key>
            <string>2-image</string>
            <key>text</key>
            <string>Text for 2</string>
        </dict>
        <key>3</key>
        <dict>
            <key>image</key>
            <string>3-image</string>
            <key>text</key>
            <string>Text for 3</string>
        </dict>
        .
        .
        .
    </dict>
</plist>

下面的代码基于a tutorial on YouTube,这是我能找到的最新且最简单的代码,但并不是我想要的...

在Combo.plist文件中

struct dict: Decodable {
    let image: String
    let text: String
}

struct Config: Decodable {
    let dict: dict
}

struct ConfigValues {
    static func get() -> Config {
        guard let url = Bundle.main.url(forResource: "Combo",withExtension: "plist") else {
            fatalError("Could not find Combo.plist in your Bundle")
        }
        do {
            let data = try Data(contentsof: url)
            let decoder = PropertyListDecoder()
            return try decoder.decode(Config.self,from: data)
        } catch let err {
            fatalError(err.localizedDescription)
        }
    }
}

在ViewController.swift文件中 我尝试打印不同的内容,但是无法从根目录打印整个词典。

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print("Print \(ConfigValues.get().dict)")
        print("Print \(ConfigValues.get().dict.image)")
        print("Print \(ConfigValues.get().dict.text)")
        print("Print \(ConfigValues.get().self)")
        //using a closed range operator ... to create a range that goes from 1 to 100
        for i in 1...100{
            print(i)
        }
    }

任何方向都值得赞赏。我应该使用数字1,2,3 ...作为字典的键吗?如何在代码中获取Root词典项的总数以循环或映射进行迭代?谢谢。

zshuong9999 回答:使用循环从plist的根级别获取字典并将其放入变量

根据评论中的建议,将根对象更改为字典数组

<?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">
<array>
    <dict>
        <key>image</key>
        <string>1-image</string>
        <key>text</key>
        <string>Text for 1</string>
    </dict>
    <dict>
        <key>image</key>
        <string>2-image</string>
        <key>text</key>
        <string>Text for 2</string>
    </dict>
    <dict>
        <key>image</key>
        <string>3-image</string>
        <key>text</key>
        <string>Text for 3</string>
    </dict>
       .
       .
       .
</array>
</plist>

删除Config并仅使用一个结构

struct Combo : Decodable {
    let image: String
    let text: String
}


struct ConfigValues {
    static func get() throws -> Config {
        guard let url = Bundle.main.url(forResource: "Combo",withExtension: "plist") else {
            fatalError("Could not find Combo.plist in your Bundle")
        }

        let data = try Data(contentsOf: url)
        return try PropertyListDecoder().decode([Combo].self,from: data)
    }
}

并迭代结果

override func viewDidLoad() {
    super.viewDidLoad()
    do {
       let combos = ConfigValues.get()
       for combo in combos {
           print(combo.image,combo.text)
       }
    } catch { print(error) }
 }
本文链接:https://www.f2er.com/3136706.html

大家都在问