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 而不是 ErrorProtocolname 而不是 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 中读取数组的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Swift 数组添加扩展以有条件地追加?

类别/扩展中的过滤器数组

简单的 Swift 数组扩展

在 Swift 中扩展泛型? [复制]

Swift 中的 iOS 共享扩展抓取 URL

替换数组中的多次出现 - Swift 4.1