butter_baby
butter_baby

Reputation: 888

Check if my array contains a dictionary

I have an array that contains a mixture of strings, arrays, and dictionaries. I would like to check if it contains a dictionary. I am trying the following, but receiving errors:

if array.contains(Dictionary<String, AnyObject>) {

 }

How would I accomplish this?

Upvotes: 1

Views: 1777

Answers (3)

Hamish
Hamish

Reputation: 80951

You don't have to bother with overloading the contains method if you don't want to – there's already a version of it that can take a custom predicate to check against each element to determine whether it should be considered to be 'in the array'.

It has the advantage of returning early as soon as it finds a match, unlike filter. You could still turn this into an extension method if you really want – but in my opinion it's so concise you shouldn't have to.

if array.contains({$0 is [String:AnyObject]}) {
    print("contains dictionary")
} else {
    print("doesn't contain dictionary")
}

Upvotes: 4

Adam H.
Adam H.

Reputation: 680

@Ryan, the type does not have to conform to the Equatable protocol.

This would get the job done:

extension Array {

    // This is a concise, yet inefficient implementation
    func contains<T>(type type : T.Type) -> Bool {
        return !filter({ $0 is T }).isEmpty
    }

    // Here is a more efficient implementation
    func contains<T>(type type : T.Type) -> Bool {
        var contains = false
        for element in self {
            if element is T {
                contains = true
                break
            }
        }
        return contains
    }
}

It can be used as such:

if array.contains(type: Dictionary<String, AnyObject>.self) {
    // Run code if the array holds a dictionary of the given type
}

Upvotes: 3

Ryan Collins
Ryan Collins

Reputation: 729

This requires that the array elements conform to the Equatable protocol (which Dictionary doesn't).

You would have to extend contains with something like this:

extension Array {
    func contains<T where T : Equatable>(obj: T) -> Bool {
        return self.filter({$0 as? T == obj}).count > 0
    }
}

Upvotes: 0

Related Questions