评估项目是否已在Array中

时间:2016-03-13 18:06:46

标签: ios swift nsarray nsuserdefaults

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

但是我一直收到错误“无法将String类型的值转换为预期的参数类型@noescape(AnyObject)抛出 - > Bool”当我尝试评估existingArr是否已经包含一个项目时,第if existingArr.contains(nD.dayOfTheWeek) == false行:

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()
        }
    }

我对它试图告诉我的内容有一个大概的了解,但还不足以实际弄明白。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这里的主要问题是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实际上是一个结构(不是一个对象),但由于某种原因,它仍然适用于简单的游乐场测试。如果有人可以在评论中解释原因,那就太棒了。