NSKeyedUnarchiver.unarchiveObject 不工作

NSKeyedUnarchiver.unarchiveObject not working

NSKeyedArchiver.archiveRootObject 被调用,但 getter returns 变量 'a' 为 nil。烦死我了。

有人看到这里有什么问题吗?

let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("Information.ab")

var info: Information? {
        get {
            let a = NSKeyedUnarchiver.unarchiveObject(withFile: url.absoluteString) as? Information
            return a
        }
        set {
            if info != newValue && newValue != nil {
                NSKeyedArchiver.archiveRootObject(newValue as Any, toFile: url.absoluteString)
            }
        }
    }

class Information: RecordModel {

    let rules: CKAsset
    let aboutUs: String
    let terms: String
    let privacyPolicy: String

    override init(record: CKRecord) {
        rules = record["rules"] as! CKAsset
        aboutUs = record["aboutUs"] as! String
        terms = record["terms"] as! String
        privacyPolicy = record["privacyPolicy"] as! String
        super.init(record: record)
    }

}

class RecordModel: NSObject, NSCoding {

    let record: CKRecord

    init(record: CKRecord) {
        self.record = record
    }

    required convenience init?(coder aDecoder: NSCoder) {
        let record = aDecoder.decodeObject(forKey: "keyRecord") as! CKRecord
        self.init(record: record)
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(record, forKey: "keyRecord")
    }

    override func isEqual(_ object: Any?) -> Bool {
        if let rhs = object as? Information {
            return record.recordID == rhs.record.recordID
        }
        return false
    }

    override var hash: Int {
        return record.recordID.hashValue
    }

}

unarchiveObject(withFilearchiveRootObject(_:toFile 都期望文件 path 没有 file:// 方案,所以在这两种情况下都是

url.path

而不是url.absoluteString