2016-06-24 4 views
0

私はunarchiveObjectWithFileを使用して得たデータに問題があります。私はアーカイブのための辞書を送る。私が得たデータは、デバッグ中の値を示していますが、データからキーの正確な値を抽出することはできません。常にnilの値swarchを使用してunarchiveObjectWithFileで辞書を展開する

を得ることはここに私のコードあなたが[String: AnyObject]Personオブジェクトをアーカイブしていませんのでです

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をアーカイブして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

関連する問題