Swift 中的 Array 扩展以使用 NSPropertyListReadOptions 从 plist 中读取数组
Posted
技术标签:
【中文标题】Swift 中的 Array 扩展以使用 NSPropertyListReadOptions 从 plist 中读取数组【英文标题】:Extension for Array in Swift to read an array from plist using NSPropertyListReadOptions 【发布时间】:2016-06-29 18:10:35 【问题描述】:我正在尝试在 Swift 中实现对数组的扩展,以便能够从 plist 文件初始化,我正在尝试使用 NSPropertyListReadOptions
extension Array
static func arrayFromPlistWithName (filename: String) -> [[String:AnyObject]]?
let path = NSBundle.mainBundle().pathForResource(filename, ofType: "plist")!
let url = NSURL(fileURLWithPath: path)
let data = NSData(contentsOfURL: url)
let opts = NSPropertyListReadOptions(rawValue: NSPropertyListMutabilityOptions.MutableContainersAndLeaves.rawValue)
let plist = try! NSPropertyListSerialization.propertyListWithData(data!, options: opts, format: nil)
return plist as? [[String:AnyObject]]
这里是我如何使用它:
let a:[[String:AnyObject]]? = Array.arrayFromPlistWithName("countries")
但我可能会出错:
Cannot convert value of type '[[String : AnyObject]]?' to specified type '[[String : AnyObject]]?'
我的问题是如何使它工作以及如何处理所有错误,因为我使用了大量的力展开,这可能是导致崩溃的原因
【问题讨论】:
顺便说一句:您可以使用URLForResource(_:ofType:)
直接获取NSURL
,而不是从String
手动创建一个
NSPropertyListSerialization.propertyListWithData 根据给定的数据创建一个 plist 文件,而不是一个数组。
【参考方案1】:
试试这样的:
enum ArrayFromPlistError: ErrorType
case InvalidPlist
extension Array
static func readArray(FromPlistNamed name: String) throws -> [AnyObject]
let path = NSBundle.mainBundle().pathForResource(name, ofType: "plist")!
if let array = NSArray(contentsOfFile:path)
return array as AnyObject as! [AnyObject]
else
throw ArrayFromPlistError.InvalidPlist
【讨论】:
更正您的代码后:ErrorType
而不是 ErrorProtocol
和 name
而不是 filename
我收到此错误:Generic parameter 'Element' could not be inferred
当尝试使用 let c = try! Array.readArrayFromPlistNamed("filename")
时
哎呀,它是 Swift 3 中的 ErrorProtocol
:) 尝试:let c: [AnyObject] = try! Array.readArrayFromPlistNamed("filename")
感谢重播Cannot convert value of type '[AnyObject]' to specified type '[AnyObject]'
在尝试您的最后一个建议时
有趣...不知道有没有人能帮忙以上是关于Swift 中的 Array 扩展以使用 NSPropertyListReadOptions 从 plist 中读取数组的主要内容,如果未能解决你的问题,请参考以下文章