我想读一个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;
}
}
但总是遇到以下错误:
在我从plist获取数据后,我想到我无法看到字典的详细信息:
我应该通过var plistArray在数组中添加泛型:[[String:Any]]?
答案 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
}
还有一些评论:
Array
个Any
项,但您的方法会尝试返回NSArray
。[Any]
。但是,如果您知道plist中的项目类型,我建议您从此方法返回正确类型的数组,例如[String]
,[Int]
等。答案 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