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!?
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.
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)
}