【问题标题】:Duplicating items already in array复制数组中已有的项目
【发布时间】:2016-03-14 21:51:29
【问题描述】:

每次我运行应用程序,然后重新运行它,它会将相同的项目保存到NSUserDefaults,即使它已经存在。

我尝试使用contains 代码解决此问题,但没有成功。

我错过了什么?

    for days in results! {
        let nD = DayClass()
        nD.dayOfTheWeek = days[“D”] as! String
        let defaults = NSUserDefaults.standardUserDefaults()
            if var existingArr = defaults.arrayForKey("D") as? [String] {
                if existingArr.contains(days["D"] as! String) == false {
                    existingArr.append(nd.dayOfTheWeek)
                }
            } else {
                defaults.setObject([nD.dayOfTheWeek], forKey: "D")
            }
        }

【问题讨论】:

  • 您能否提供更多有关您尝试使用该数组做什么的信息。
  • 维克多,你不应该使用 defaults.synchronize()。 “所以是的,长话短说,不要在 iOS 8 及更高版本中使用同步。” -codingexplorer.com/nsuserdefaults-a-swift-introduction 此外,您应该尝试只在项目顶部定义一次默认值(让默认值 =...)。
  • @JohnRamos 好的,谢谢!我改变了它,它仍然在做同样的事情。但也许您更多的是查看格式提示等,谢谢。
  • @Cing 例如,我正在从 API 中提取“星期几”。它恰好拉星期一,把它放在数组中。然后当我第二次运行该应用程序时,它会再次拉取星期一,并再次将其放入数组中;我想要的是看看星期一是否已经在数组中,不要再把它放在那里。有道理吗?谢谢!
  • @JohnRamos 我更新了格式和代码!

标签: ios swift nsarray nsuserdefaults


【解决方案1】:

每次我运行应用程序,然后重新运行它,它会将相同的项目保存到 NSUserDefaults 中,即使它已经存在。

是的,因为这正是您的代码所做的:

defaults.setObject(existingArr, forKey: "D")

但是existingArr 是什么?这是您之前加载的默认值:

if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("D") as? [String]

那么会发生什么,当你进入.contains分支时,你总是做同样的操作:你保存现有的数组。

与您在代码中的注释相反,您没有将任何内容附加到该块中的任何数组,而是保存现有的。

【讨论】:

  • 感谢您的评论。我在想if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("D") 会设置一个我在默认值中拥有的项目的数组,然后if existingArr.contains(nD.dayOfTheWeek) == false { 会检查我是否已经有一周中的那一天,如果没有,它会添加它。那么您所说的defaults.setObject(existingArr, forKey: "D") 是错误的代码,然后我将我的代码更新为append 到现有数组,如果这就是您所说的吗?希望现在更清楚了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 2017-11-13
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多