NSDictionary init(contentsOfFile :)现已弃用,现在怎么办?

时间:2017-07-12 16:40:45

标签: ios nsdictionary plist ios11

最近(从iOS 11开始),init(contentsOfFile:)中的NSDictionary已弃用。

enter image description here

我想成为具有前瞻性思维的公民,所以我寻找另一种方法将属性列表(plist)加载到NSDictionary类型中。我唯一能找到的是PropertyListSerialization,但相对来说比较麻烦。

这就是我想出的差异所在:

func dealWithFakeConf(atPath path:String) {
    // So easy!
    let myD:Dictionary<String,Any> = NSDictionary.init(contentsOfFile: path) as! Dictionary<String, Any>
    let l = myD["location"] as? String ?? "BAD_STRING"
    let q = myD["quantity"] as! Int
    print("location = \(l)")
    print("quantity = \(q.description)")

    // Old is new again?!
    guard let rawData = FileManager.default.contents(atPath: path) else {
        fatalError("Sumpin done gone wrong!")
    }
    var format = PropertyListSerialization.PropertyListFormat.xml
    let data = try? PropertyListSerialization.propertyList(from:rawData, options:[.mutableContainers], format:&format)
    guard let realData = data as? Dictionary<String,Any> else {
        fatalError("OMG! Now what?")
    }
    locationLabel.text = realData["location"] as? String ?? "BAD_STRING"
    let qty:Int? = realData["quantity"] as? Int
    quantityLabel.text = qty?.description
}

我注意到this answer over here已将PropertyListSerialization的使用归结为我提出的更少的代码,但在阅读Apple's 7 year old docs Property List Programming Guide时这并不明显。而这个例子是 3个缩进深度。

我在其他地方错过了替换便利初始化程序吗?这就是我们现在要把一个plist加载到一个字典中吗?

1 个答案:

答案 0 :(得分:4)

这不是一个公平的比较。

实际上是

的文字翻译
let myD = NSDictionary(contentsOfFile: path) as! [String : Any]

let rawData = try! Data(contentsOf: URL(fileURLWithPath: path))
let realData = try! PropertyListSerialization.propertyList(from: rawData, format: nil) as! [String:Any]

在这两种情况下,如果出现问题,代码会崩溃。

但是在这两种情况下都应该进行适当的错误处理。