【问题标题】:Evaluate if item is already in Array评估项目是否已经在数组中
【发布时间】:2016-03-13 18:06:45
【问题描述】:

我正在尝试评估一个项目是否已经在 existingArr 中,这样我就不会多次添加它。

但是当我尝试评估 existingArr 是否已经包含一个项目时,我不断收到错误“无法将 String 类型的值转换为预期的参数类型 @noescape (AnyObject) throws -> Bool”,在这一行 @987654323 @在:

for days in results! {
    let nD = DayClass()
    nD.dayOfTheWeek = days[“D”] as! String
        //check if there is already an existing Day array in prefs
        if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("D") {
            //if so append the new value to that array and store it
            if existingArr.contains(nD.dayOfTheWeek) == false {
                let defaults = NSUserDefaults.standardUserDefaults()
                defaults.setObject(existingArr, forKey: "D")
                defaults.synchronize()
            }
        } else {
            //create a new array and store it
            let defaults = NSUserDefaults.standardUserDefaults()
            defaults.setObject([nD.dayOfTheWeek], forKey: "D")
            defaults.synchronize()
        }
    }

我对它试图告诉我的内容有一个大致的了解,但还不足以真正弄清楚。非常感谢任何帮助。

【问题讨论】:

  • 您可能需要registerDefaults 为用户默认值,以确保“D”的对象是一个数组,然后再检索它。
  • 他用if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("D") 做到了这一点,尽管看起来他应该在转换为String 之前检查days[“D”] 是否存在

标签: ios swift nsarray nsuserdefaults


【解决方案1】:

这里的主要问题是arrayForKey: 返回[AnyObject]?,并不是所有的对象都是Equatable

为什么需要Equatablecontains 有两种实现:一种采用对象,另一种采用谓词(以闭包的形式)。但是,接受对象的contains 要求生成器(本例中为数组)具有符合Equatable 的元素(数组中的对象)。

因为并非所有对象都是 Equatable,而且 existingArr 的类型为 [AnyObject]?,所以 Xcode 假定您正在尝试调用 contains 的谓词形式。但是,nD.dayOfTheWeek 不是闭包,因此 Xcode 会抛出一个错误,指出它不是闭包。

要解决此问题,您需要将 existingArr 转换为类型 [String],因为这是它的类型并且字符串是 Equatable:

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

注意:这实际上不应该工作,因为String 实际上是一个结构(不是对象),但由于某种原因,它仍然可以在简单的游乐场测试中工作。如果有人能在 cmets 中解释原因,那就太好了。

【讨论】:

  • 那是扩展解释,非常有帮助。但是由于某种原因,当我根据代码行更新我的代码时,它仍在添加我已经拥有的项目。我不确定为什么仍然会发生这种情况。
  • @victorpulak 你是什么意思它还在添加你已经拥有的项目?
  • 对不起,我应该更清楚:错误消失了,但我的代码仍在多次将项目添加到数组中。因此,如果我运行应用程序,并将一周中的 7 天添加到数组中,然后停止添加并再次运行它,数组中有一周中的 14 天,其中每个项目在那里两次(星期一是在那里两次)。所以不知何故我的contains 代码不能过滤掉第二个“星期一”等。我希望这更有意义。
猜你喜欢
  • 2012-05-07
  • 2017-08-11
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多