swiftyboi
swiftyboi

Reputation: 3231

Why can't I check to see if my array of arrays contains a specific array?

I'm trying to check to see if an array of arrays contains an array of Strings. My error message says:

"Cannot find an overload for 'contains' that accepts an argument list of type '([([(String)])]), [(String)])'"

var allCards = [[String]]()
var exp1 = [String]()

if !contains(allcards, exp1) {
    allCards.append(exp1)
}

What's going on!?

Upvotes: 1

Views: 796

Answers (2)

Fantini
Fantini

Reputation: 2077

Update for Swift2:

contains() is now a function defined in a protocol extension of Sequence therefore:

var allCards = [[String]]()
var exp1 = [String]()

if !allCards.contains( { $0 == exp1 } ) {
    allCards.append(exp1)
}

Upvotes: 1

Martin R
Martin R

Reputation: 540145

Array does not conform to the Equatable protocol, therefore

/// Return `true` iff `x` is in `seq`.
func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool

cannot be used here. You can use the predicate-based variant

/// Return `true` iff an element in `seq` satisfies `predicate`.
func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool

instead:

var allCards = [[String]]()
var exp1 = [String]()

if !contains(allCards, { $0 == exp1 } ) {
    allCards.append(exp1)
}

because == is defined for arrays of Equatable elements.

Upvotes: 7

Related Questions