2017-08-25 73 views
1

我想读的NSArray形式的plist,代码:如何在Swift中读取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]]?

+0

函数的返回类型是'[Any]',并且您非常感谢'NSArray' –

回答

1

你的方法签名中明确指出,它返回一个[Any](任何类型的任何的即斯威夫特本地Array包含元素),而你试图返回值的类型转换成NSArray(即使它已经凭借intialization的: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%肯定不管它是你正在迫使不会失败,并导致运行时错误(崩溃)。

+0

。我是新来的,可选类型真的让我有些困惑。 – Neko

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) 
     } 
    } 
+0

还感谢,但我的根值是一个数组 – Neko

+0

@Neko这里是数组 –

0
 return (arry) as! [Any] 

您不能在类型返回NSArray的你正在告诉你什么是错的方法的任何

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. 你在声明方法返回AnyArray项目,但你的方法试图返回NSArray
  2. 建议使用基于URL的方法来访问文件,而不是基于字符串的路径。
  3. 您必须使用Array方法来读取plist中,但可以将其转换为[Any]。但是,如果您知道plist中的项目类型,我建议您从此方法返回正确类型的数组,例如[String][Int]
  4. 你并不需要返回一个可选的,如果该文件无法读取。根据您要如何处理,你既可以返回一个空数组错误(我在这里显示)或转换你的函数成抛出一个因此,如果您不能读取引发错误的文件,并可以处理由调用代码。