当我尝试通过 Bundle.main 访问它时,我的 plist returns 为零,但我知道它在那里

My plist returns nil when I try to access it through the Bundle.main, but I know it's there

我在代码中创建了一个名为 Configuration.plist 的 .plist 文件。 运行 应用一次后,我可以在文件系统(使用模拟器)中看到它确实存在。

我正在学习 iOS 开发。在互联网上搜索“如何从我自己的 plist 中读取”的答案后,我不断看到教程告诉我像这样读取这个文件:

if let path = Bundle.main.path(forResource: K.files.config, ofType: "plist"),
           let xml = FileManager.default.contents(atPath: path),
           let config = try? PropertyListDecoder().decode(Configuration.self, from: xml){

            print("We have a config: \(config.mainTitle)")
            return config
        } else {
            print("No config ☹️")
            return nil
        }

在上面的例子中,K.files.config只是一个字符串常量,配置class符合Codable协议。 K.file.config 的值为“配置”。但是,在上面的示例中,路径总是 returns nil。但是我知道这个文件存在!!

事实上,当我这样访问这个文件时,我实际上可以得到路径:

let fileName = K.files.config + ".plist"
        var filePath = ""
        
        let dirs: [String] = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true)
        
        if dirs.count > 0 {
            let dir = dirs[0]
            filePath = dir.appendingFormat("/" + fileName)
            print("Local path: \(filePath)")
        } else {
            print("Could not find local directory for Configuration.plist")
            return nil
        }
        
        if let xml = FileManager.default.contents(atPath: filePath),
           let config = try? PropertyListDecoder().decode(Configuration.self, from: xml){
            print("got a config: \(config.mainTitle)")
        } else {
            print("didn't get the xml")
        }

这更加冗长和丑陋。为什么第一种方法不行?

当您创建 Configuration.plist 时,您将其保存到 Documents 文件夹中...

该文件夹您的应用程序包之外。

因此,在您的第一个代码块中,您尝试从包加载它,但失败了。

您的第二个代码块正确地从 Documents 文件夹中查找并加载文件。