我想检查一个项目是否存在于数组中:
protocol Item {
var name: String! {get set}
var value: Int! {get set}
}
class UserList {
var items: [Item]!
func checkItem(item: Item) -> Bool{
if items.contains(where: {$0 === item}) { // Error
return true
}
return false
}
}
我收到此错误:
Binary operator '===' cannot be applied to two 'Item' operands
答案 0 :(得分:1)
如果您真的想为===
使用身份识别运算符(checkItem
),可以将Item
声明为类协议:
protocol Item: class {
var name: String! {get set}
var value: Int! {get set}
}
class UserList {
var items: [Item]!
func checkItem(item: Item) -> Bool{
return items.contains {$0 === item}
}
}
(我不明白为什么你需要隐式解包的Optionals,所以我把它们留在那里。但我自己永远不会使用这么多的IUO。)
但我想知道身份是否是你想要的:
class ClassItem: Item {
var name: String!
var value: Int!
init(_ name: String, _ value: Int) {
self.name = name
self.value = value
}
}
let myList = UserList()
myList.items = [ClassItem("aaa", 1), ClassItem("bbb", 2)]
var result = myList.checkItem(item: ClassItem("aaa", 1))
print(result) //->false
如果结果false
不符合您的预期,则需要为Item
定义自己的相等,并使用它定义checkItem(item:)
。< / p>
答案 1 :(得分:0)
我总是使用这个来自objecitve-c
的简单解决方案let array = ["a,b"]
if let _ = array.index(of: "b")
{
//if "b" is in array
}
else
{
//if "b" is not in aray
}