如何在Swift中读取Plist?
我想读的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;
}
}
但总是有以下错误:
而我从plist中的数据后,我发现用我看不到词典的详细信息:
我应该通过var plistArray在数组中添加一个泛型:[[String:Any]]?
你的方法签名中明确指出,它返回一个[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%肯定不管它是你正在迫使不会失败,并导致运行时错误(崩溃)。
。我是新来的,可选类型真的让我有些困惑。 – Neko
我在我的项目中使用类似这样的东西。
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)
}
}
还感谢,但我的根值是一个数组 – Neko
@Neko这里是数组 –
return (arry) as! [Any]
您不能在类型返回NSArray的你正在告诉你什么是错的方法的任何
的错误讯息,这是我会怎么写功能:
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
}
还有一些解说:
- 你在声明方法返回
Any
的Array
项目,但你的方法试图返回NSArray
。 - 建议使用基于URL的方法来访问文件,而不是基于字符串的路径。
- 您必须使用Array方法来读取plist中,但可以将其转换为
[Any]
。但是,如果您知道plist中的项目类型,我建议您从此方法返回正确类型的数组,例如[String]
,[Int]
等 - 你并不需要返回一个可选的,如果该文件无法读取。根据您要如何处理,你既可以返回一个空数组错误(我在这里显示)或转换你的函数成抛出一个因此,如果您不能读取引发错误的文件,并可以处理由调用代码。
函数的返回类型是'[Any]',并且您非常感谢'NSArray' –