Swift encodeObjectForKey - 使用nil

时间:2016-07-04 06:02:12

标签: ios swift nscoder

我在SE的第一篇文章,所以请轻轻地对我说....:)

我是swift和iOS开发的新手,但过去几个月一直在学习。

我有一个应用,用于通过NSCoderencodeObjectForKey保存日期和值。我将NSDate值传递给此值,并且可以毫无问题地解码它们。

但是,如果我尝试传入nil来覆盖现有值,则不会存储它,因为在解码并返回值之后返回旧值。

我搜索并发现将nil传递给encodeObjectForKey方法似乎是有效的,但我找不到任何告诉我这是否会在用nil过度处理现有值时起作用的东西。

有人可以提供有关如何删除现有值的指导吗?

我的代码:

aCoder.encodeObject(dateSold, forKey: PropertyKey.dateSoldKey)    
let dateSold = aDecoder.decodeObjectForKey(PropertyKey.dateSoldKey) as? NSDate

编辑:似乎我更新的Nil日期值没有通过segue返回到保存更新并调用encodeObject的类。我会去调查。抱歉浪费时间......

1 个答案:

答案 0 :(得分:0)

我认为,虽然decoding可以检查对象是否与前一个对象相等。如果对象等于上一个对象,则将其设为nil

//: Playground - noun: a place where people can play

import UIKit
import Foundation

class Dates : NSObject
{
    //MARK: Local Variables

    var createdAt: NSDate?
    var previoudDate : NSDate?

    required convenience init(coder decoder: NSCoder)
    {
        self.init()

        if let proper_CreatedAt = decoder.decodeObjectForKey("YourKey") as? NSDate {

            if let proper_previousDate = self.previoudDate where proper_previousDate == proper_CreatedAt
            {
                decoder.encodeObject(nil, forKey: "YourKey")
                self.createdAt = nil
                self.previoudDate = nil
            }
            else
            {
                self.createdAt = proper_CreatedAt
                self.previoudDate = proper_CreatedAt
            }
        }
        else {
            decoder.encodeObject(nil, forKey: "YourKey")
        }
    }

    convenience init(createdAt : NSDate?)
    {
        self.init()
        self.createdAt = createdAt
    }

    func encodeWithCoder( coder : NSCoder)
    {
         if let proper_previousDate = self.createdAt
        {
        coder.encodeObject(proper_previousDate, forKey: "YourKey")
        }
    }
}

let kk = Dates()
kk.createdAt = NSDate()
print(kk.createdAt)

还找到了两种可以帮助你解决这个问题的方法,

decoder.replacementObjectForCoder(NSCoder)
decoder.replacementObjectForKeyedArchiver(NSKeyedArchiver)

但这些输入类型为NSCoder& NSKeyedArchiver,而不是key