如何在Swift中阅读Plist?

时间:2017-08-25 08:33:49

标签: ios swift

我想读一个NSArray表单plist和代码:

func loadPlistArray() -> [Any] {

    var path: String? = Bundle.main.path(forResource:"MyCenter", ofType: "plist")

    if let arry = NSArray(contentsOfFile: path!) {
        return arry as! NSArray
    }else{
        return nil;
    }

}

但总是遇到以下错误:

enter image description here 在我从plist获取数据后,我想到我无法看到字典的详细信息:

enter image description here

这是我的plist: enter image description here

我应该通过var plistArray在数组中添加泛型:[[String:Any]]?

4 个答案:

答案 0 :(得分:2)

您收到的错误消息告诉您方法有什么问题,这就是我编写函数的方法:

func loadPlistArray() -> [Any] { // 1
    guard
        let url = Bundle.main.url(forResource: "MyCenter", withExtension: "plist"), // 2
        let list = NSArray(contentsOf: url) as? [Any] // 3
        else { return [] } // 4

    return list
}

还有一些评论:

  1. 您声明方法返回ArrayAny项,但您的方法会尝试返回NSArray
  2. 建议使用基于URL的方法来访问文件,而不是基于字符串的路径。
  3. 您必须使用Array方法来读取plist,但您可以将其强制转换为[Any]。但是,如果您知道plist中的项目类型,我建议您从此方法返回正确类型的数组,例如[String][Int]等。
  4. 如果无法读取文件,则无需返回可选项。根据您想要处理错误的方式,您可以返回一个空数组(如我在此处所示)或将您的函数转换为抛出函数,这样如果您无法读取该文件,则会抛出错误并可以处理通过调用代码。

答案 1 :(得分:1)

您的方法签名明确指出它会返回[Any](即Swift本地Array包含任何类型的元素),同时您尝试将返回值强制转换为NSArray(即使它已经是因为初始化:NSArray(contentsOfFile:))。

将其更改为:

return arry as? [Any] 
// (will return nil if the cast fails - not a problem if you
//  also apply the fix mentioned below...)

另一条路径尝试返回nil;为了使其可以接受,您的签名需要定义为返回可选

func loadPlistArray() -> [Any]  // WRONG

func loadPlistArray() -> [Any]? // RIGHT

编辑:如果您的应用的结构方式使您无法从方法中返回nil,则可以在失败时返回空数组:

else {
    return [] // Empty array
}

(使用[:]表示空字典)

另外,尽量避免使用!,并转而使用?,除非您100%确定无论您强制执行的操作都不会失败并导致运行时错误(崩溃) )。

答案 2 :(得分:0)

我在我的项目中使用这样的东西。

  if let fileUrl = Bundle.main.url(forResource: "new", withExtension: "plist"),
     let myDict = NSDictionary(contentsOf: fileUrl) as? [String:Any] {
            print(myDict)
        }

我有另一个颜色的plist,它以数组为根。

        if let fileUrl = Bundle.main.url(forResource: "color", withExtension: "plist"),
        let data = try? Data(contentsOf: fileUrl) {
        if let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [Any] {
            print(result)
        }
    }

答案 3 :(得分:0)

     return (arry ) as! [Any]

您无法在Any类型

上返回NSArray