2016-06-24 60 views
0

我遇到了使用unarchiveObjectWithFile获得的数据问题。我发送一本字典进行归档。我得到的数据显示了调试时的值,但我无法从数据中提取关键值的确切值。始终获得零值使用swift解压缩unarchiveObjectWithFile字典

这里是我的代码

class Person : NSObject, NSCoding { 
struct Keys { 
    static let Name = "name" 
    static let Age = "age" 
} 

var name: [String] = [] 
var age: [Int] = [] 

init(dictionary: [String : AnyObject]) { 
    name = dictionary[Keys.Name] as! [String] 
    age = dictionary[Keys.Age] as! [Int] 
} 

func encodeWithCoder(archiver: NSCoder) { 
    archiver.encodeObject(name, forKey: Keys.Name) 
    archiver.encodeObject(age, forKey: Keys.Age) 
} 

required init(coder unarchiver: NSCoder) { 

    if let namesList = unarchiver.decodeObjectForKey(Keys.Name) as? [String] { 
     name = namesList 
     print("name\(name)") 
    } 
    if let agesList = unarchiver.decodeObjectForKey(Keys.Age) as? [Int] { 
     age = agesList 
     print("age \(age)") 
    } 
    super.init() 
} 
} 

// View controller 
class ViewController: UIViewController { 
override func viewDidLoad() { 
    super.viewDidLoad() 

    let persons: [String:AnyObject] = [ 
     "name" : ["a","b","c"], 
     "age" : [2,3,4] 
    ] 

    let personObj = Person(dictionary: persons) 
    NSKeyedArchiver.archiveRootObject(personObj, toFile: "/Users/shuvo/Desktop/Data.json") 

    let responseObject = NSKeyedUnarchiver.unarchiveObjectWithFile("/Users/shuvo/Desktop/Data.json") as? Person 

    if let unwrapData: AnyObject = responseObject { 
     let nameArr = unwrapData["name"] as? [String] 
     let ageArr = unwrapData["age"] as? [Int] 
     print("age \(ageArr) name \(nameArr)") 
    } 
} 

override func didReceiveMemoryWarning() { 
super.didReceiveMemoryWarning() 
// Dispose of any resources that can be recreated. 
    } 
    } 

回答

1

那是因为你存档的Person对象,而不是[String: AnyObject]

您可以将Person归档,并将其解压缩为Person或归档[String: AnyObject]并将其解压缩。你不能使用它们,因为它们是不同的类型。

如果要存档Person对象,请确保您实现NSCoding协议,并在你的Person类类似这样的东西...

func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: "name") 
    aCoder.encode(age, forKey: "age") 
} 

required init?(coder aDecoder: NSCoder) { 
    self.name = aDecoder.decodeObject(forKey: "name") as! [String] 
    self.age = aDecoder.decodeObject(forKey: "age") as! [Int] 
} 

之后,你可以做...

if let responseObject = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Person { 
    // You can use `responseObject` as a `Person` object here... 
} 
+0

是的你是对的。谢谢。 – Developer

+0

一定要接受答案,如果它的工作。 – andyl

+0

对不起,我花了很长时间才弄清楚如何接受答案。 – Developer