Swift 2 Array Contains object?
Solution 1
Your Dog
needs to implement Equatable
.
class Dog: Equatable {
var age = 1
}
func == (lhs: Dog, rhs: Dog) -> Bool {
return lhs.age == rhs.age
}
Solution 2
To really explain what's happening there, first we have to understand there are two contains
methods on Array
(or better said, on SequenceType).
func contains(_ element: Self.Generator.Element) -> Bool
with constraints
Generator.Element : Equatable
and
func contains(@noescape _ predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
The first one basically searches for a given element in the array using ==
. The second one uses a closure that returns a Bool
to search for elements.
The first method cannot be used because Dog
doesn't adopt Equatable
. The compiler tries to use the second method but that one has a closure as the parameter, hence the error you are seeing.
Solution: implement Equatable
for Dog
.
If you are looking for object reference comparison, you can use a simple closure:
let result = dogs.contains({ $0 === sparky })
Solution 3
Swift
If you are not using object then you can user this code for contains.
let elements = [ 10, 20, 30, 40, 50]
if elements.contains(50) {
print("true")
}
If you are using NSObject Class in swift. This variables is according to my requirement. you can modify for your requirement.
var cliectScreenList = [ATModelLeadInfo]()
var cliectScreenSelectedObject: ATModelLeadInfo!
This is for a same data type.
{ $0.user_id == cliectScreenSelectedObject.user_id }
If you want to AnyObject type.
{ "\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)" }
Full condition
if cliectScreenSelected.contains( { $0.user_id == cliectScreenSelectedObject.user_id } ) == false {
cliectScreenSelected.append(cliectScreenSelectedObject)
print("Object Added")
} else {
print("Object already exists")
}
Mitchell Hudson
Updated on June 12, 2022Comments
-
Mitchell Hudson almost 2 years
Why isn't this working? I can use array.contains() on a String but it doesn't work for an Object.
var array = ["A", "B", "C"] array.contains("A") // True class Dog { var age = 1 } var dogs = [Dog(), Dog(), Dog()] var sparky = Dog() dogs.contains(sparky) // Error Cannot convert value of type 'Dog' to expected argument type '@noescape (Dog) throws -> Bool
-
Mitchell Hudson about 8 yearsThanks for the explanation.
-
Mitchell Hudson about 8 yearsIt's not possible to search for the Object reference?
-
Sulthan about 8 years@user752543 It is, if you use a closure. See my edit.