Swift 5:如何读取plist文件中的变量?

Mar*_*rro 2 xcode plist ios swift

我搜索了一种如何读取存储在 plist 文件中的变量的方法(或模板)。我看到了一些代码,但没有代码适用于最新的 Swift 版本。

我是 Swift 的新手,实际上我并没有检查它到底是如何工作的..有人可以这么好并给我一个例子吗?

我有一个 CollectionView,想要显示我的 plist 文件中的字符串。这是我的 plist 文件:

对于每个动物键(字典类型)两个子键(名称和图片)。根 --> 动物 --> 动物1

除“名称”和“图片”之外的所有键都是字典。现在我想获取字典并在我的收藏视图中显示名称和图片。稍后我将添加更多变量。我希望这是可以理解的 :'D

我的不完整代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    let path = Bundle.main.path(forResource: "Animals", ofType:"plist")!
    let dict = NSDictionary(contentsOfFile: path)
    SortData = dict!.object(forKey: "Animals") as! [Dictionary]
}
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 6

您的财产清单格式不是很方便。因为您想要一个数组,所以无论如何都要创建带有键数组的属性列表animals(并将所有键命名为小写)

<?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>animals</key>
    <array>
        <dict>
            <key>name</key>
            <string>Tiger</string>
            <key>picture</key>
            <string>tiger_running</string>
        </dict>
        <dict>
            <key>name</key>
            <string>Jaguar</string>
            <key>picture</key>
            <string>jaguar_sleeping</string>
        </dict>
    </array>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

然后创建两个结构体

struct Root : Decodable {
    let animals : [Animal]
}

struct Animal : Decodable {
    let name, picture : String
}
Run Code Online (Sandbox Code Playgroud)

和数据源数组

var animals = [Animal]()
Run Code Online (Sandbox Code Playgroud)

并解码这些东西

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    let url = Bundle.main.url(forResource: "Animals", withExtension:"plist")!
    do {
        let data = try Data(contentsOf: url)
        let result = try PropertyListDecoder().decode(Root.self, from: data)
        self.animals = result.animals
    } catch { print(error) }
}
Run Code Online (Sandbox Code Playgroud)

PropertyListDecoder并且PropertyListSerialization是 Swift 中最先进的。该NSDictionary/NSArrayAPI 是Objective-C-ish并且已经过时了。