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



(发布后编辑标题,它是一组字典,而不是一组字典(

我在根字典里有很多字典。所有的字典都有相同的关键字("image"one_answers"text"(。

我如何从.plist中获取键和值,以便将其放入变量中,如字典中的字典(包含更多项目,例如最多100个图像和文本(,如下所示?

var imageTextDict=[["image":"1-image","text":"text for 1"],["image:"2-image","text":"text for 2"],["image":"3-image">

我发现的大多数代码要么很旧,要么没有回答我的问题。。。我能得到的最接近的方法是在根字典中打印特定字典的键和值,而不是从根中打印完整列表。

在.plist(键(根、(类型(字典、(值(例如。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>

下面的代码是基于YouTube上的教程,这是我能找到的最新、最简单的,但不是我想要的。。。

在组合列表文件中

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…作为字典中的关键字吗?如何获取代码中要使用循环或映射进行迭代的根字典项的总数?谢谢

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

<?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) }
}

最新更新