我正在尝试评估一个项目是否已经在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()
}
}
我对它试图告诉我的内容有一个大概的了解,但还不足以实际弄明白。非常感谢任何帮助。
答案 0 :(得分:0)
这里的主要问题是arrayForKey:
返回[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
实际上是一个结构(不是一个对象),但由于某种原因,它仍然适用于简单的游乐场测试。如果有人可以在评论中解释原因,那就太棒了。