评估项目是否已经在数组中
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
.
为什么需要Equatable
? contains
有两种实现方式:一种采用对象,一种采用谓词(以闭包的形式)。但是,接受对象的 contains
要求生成器(在本例中为数组)的元素(数组中的对象)符合 Equatable
.
因为并非所有对象都是 Equatable,并且 existingArr
是 [AnyObject]?
类型,Xcode 假定您正在尝试调用 contains
的谓词形式。但是,nD.dayOfTheWeek
不是闭包,因此 Xcode 会抛出一个错误,说明它不是闭包。
要解决此问题,您需要将 existingArr
转换为类型 [String]
,因为这是它的类型并且字符串是 Equatable:
if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("D") as? [String] {
注意:这实际上不应该起作用,因为 String
实际上是一个结构(不是对象),但出于某种原因它在简单的操场测试中仍然有效。如果有人能在评论中解释原因,那就太好了。
我正在尝试评估一个项目是否已经在 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
.
为什么需要Equatable
? contains
有两种实现方式:一种采用对象,一种采用谓词(以闭包的形式)。但是,接受对象的 contains
要求生成器(在本例中为数组)的元素(数组中的对象)符合 Equatable
.
因为并非所有对象都是 Equatable,并且 existingArr
是 [AnyObject]?
类型,Xcode 假定您正在尝试调用 contains
的谓词形式。但是,nD.dayOfTheWeek
不是闭包,因此 Xcode 会抛出一个错误,说明它不是闭包。
要解决此问题,您需要将 existingArr
转换为类型 [String]
,因为这是它的类型并且字符串是 Equatable:
if var existingArr = NSUserDefaults.standardUserDefaults().arrayForKey("D") as? [String] {
注意:这实际上不应该起作用,因为 String
实际上是一个结构(不是对象),但出于某种原因它在简单的操场测试中仍然有效。如果有人能在评论中解释原因,那就太好了。