菜鸟教程小白 发表于 2022-12-11 16:53:25

ios - Swift encodeObjectForKey - 用 nil 更新值


                                            <p><p>我在 SE 的第一篇文章,所以请对我温柔一点.... :)</p>

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

<p>我有一个应用程序,用于通过 <code>NSCoder</code> 和 <code>encodeObjectForKey</code> 保存日期和值。我将 <code>NSDate</code> 值传递给它,并且可以毫无问题地对其进行解码。</p>

<p>但是,如果我尝试传入 nil 来覆盖现有值,它似乎不会存储,因为旧值是在值被解码并返回后返回的。 </p>

<p>我搜索并发现将 nil 传递给 <code>encodeObjectForKey</code> 方法似乎是有效的,但我找不到任何可以告诉我在使用 nil 过度处理现有值时这是否会起作用的任何信息。 </p>

<p>谁能提供有关如何删除现有值的指导?</p>

<p>我的代码:</p>

<pre><code>aCoder.encodeObject(dateSold, forKey: PropertyKey.dateSoldKey)   
let dateSold = aDecoder.decodeObjectForKey(PropertyKey.dateSoldKey) as? NSDate
</code></pre>

<p>编辑:似乎我更新的 Nil 日期值没有通过 segue 回到保存更新并调用 encodeObject 的类。我去调查一下。为浪费时间道歉....</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我认为,在 <code>解码</code> 时,您可以检查对象是否等于前一个对象。如果对象等于前一个对象,则使其 <code>nil</code>.</p>

<pre><code>//: 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(&#34;YourKey&#34;) as? NSDate {

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

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

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

let kk = Dates()
kk.createdAt = NSDate()
print(kk.createdAt)
</code></pre>

<p>还找到了两种方法可以帮助您解决这个问题,</p>

<pre><code>decoder.replacementObjectForCoder(NSCoder)
decoder.replacementObjectForKeyedArchiver(NSKeyedArchiver)
</code></pre>

<p>但是这些输入类型是 <code>NSCoder</code> 和 <code>NSKeyedArchiver</code>,而不是 <code>key</code>。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Swift encodeObjectForKey - 用 nil 更新值,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/38177821/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/38177821/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Swift encodeObjectForKey - 用 nil 更新值