1

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!?

1
  • The class used in contains method should implement Equatable protocol. As it is required to check whether two elements are equal. Commented Sep 7, 2015 at 19:02

2 Answers 2

7

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.