2016-03-29 9 views
1

これは私のカスタムデモクラスです:Swiftオプションがゼロになるのはなぜですか?

class Demo: NSObject, NSCoding { 
    var id: Int? 

    override init() { 
     super.init() 
    } 
    required init?(coder aDecoder: NSCoder) { 
     self.id = aDecoder.decodeIntegerForKey("ID") 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     if let id = self.id{ 
      aCoder.encodeInteger(id, forKey: "ID") 
     } 

    } 
} 

保存私は、オブジェクトを作成し、このようなNSUserDefaultsに保存しています

let demo = Demo() 
let archiveData = NSKeyedArchiver.archivedDataWithRootObject(demo) 
     NSUserDefaults.standardUserDefaults().setObject(archiveData, forKey: "ff") 

デバッグ結果は、それが良い

enter image description here

を動作することを示しています

今私はこのようにNSUserDefaultsからオブジェクトを選んだ:

let retainData = NSUserDefaults.standardUserDefaults().objectForKey("ff") as! NSData 
let retainDemo = NSKeyedUnarchiver.unarchiveObjectWithData(retainData) as! Demo 

は今、デバッグ後に私が発見した:

enter image description here

は今2つの結果の違いを確認してください。前のid値は、オブジェクトをピックしてからid値がゼロになった後にnilになります。私は対象を何も変更していない。 NSUserdefaultsに保存して、逆に選択するだけです。これの背後にある理由は何ですか?どのように問題を克服するのですか?

答えて

4

理由はdecodeIntegerForKeyはオプションのIntを返さないためです。 Intを返します。したがって、IDが存在しない場合は、通常はInt変数のデフォルト値である0を返します。 IDオブジェクトを持つデコーダをチェックすることでこれを修正できます。

required init?(coder aDecoder: NSCoder) { 
    if aDecoder.containsValueForKey("ID") { 
     self.id = aDecoder.decodeIntegerForKey("ID") 
    } 
} 
関連する問題