Why can't I check to see if my array of arrays

2019-01-20 17:23发布

问题:

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:

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.



回答2:

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