Swift 2 Array Contains object?

11,593

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")

}
Share:
11,593
Mitchell Hudson
Author by

Mitchell Hudson

Updated on June 12, 2022

Comments

  • Mitchell Hudson
    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
    Mitchell Hudson about 8 years
    Thanks for the explanation.
  • Mitchell Hudson
    Mitchell Hudson about 8 years
    It's not possible to search for the Object reference?
  • Sulthan
    Sulthan about 8 years
    @user752543 It is, if you use a closure. See my edit.