评估项目是否已经在数组中

Evaluate if item is already in Array

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

但是当我尝试评估 existingArr 是否已经包含一个项目时,我一直收到错误 "Cannot convert value of type String to expected argument type @noescape (AnyObject) throws -> Bool",在这一行 if existingArr.contains(nD.dayOfTheWeek) == false in:

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

我大致了解它要告诉我的内容,但还不足以真正弄明白。非常感谢任何帮助。

这里的主要问题是 arrayForKey: returns [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 实际上是一个结构(不是对象),但出于某种原因它在简单的操场测试中仍然有效。如果有人能在评论中解释原因,那就太好了。