Swift中判断一个Array中是否包含某个元素,我们可以使用contains方法,如下代码所示:

let array = [2, 5, 6, 7, 19, 40]

array.contains(10)				// false

不过这个方法要求数组中的元素类型实现了Equatable协议,否则无法使用,如下代码所示:

enum Animal {
    case dog
    case cat(Int)
}

let animals: [Animal] = [.dog, .dog]
let hasCat = animals.contains(.cat(100))	// 编译器错误

还好Swift为我们提供了另一个contains方法,可以自定义谓词条件作为判断依据,其定义如下:

public func contains(where predicate: (Element) throws -> Bool) rethrows -> Bool

这个方法会查看数组是否包含满足给定的谓词条件的元素。可以看到这个方法是一个高阶函数,其参数是一个尾随闭包,在闭包内我们可以根据实际需要来实现我们自己的判断。所以上面的判断可以如下代码实现:

enum Animal {
    case dog
    case cat(Int)
}

let animals: [Animal] = [.dog, .dog]
let hasCat = animals.contains { animal in
    
    if case .cat = animal {
        return true
    } else {
        return false
    }
}

当然,对于元素类型实现了Equatable协议的数组,也可以使用这个方法。可以自定义谓词条件,查看数组是否有满足此条件的元素,如下代码所示:

let array = [2, 5, 6, 7, 19, 40]

array.contains { (element) -> Bool in
    element % 7 == 0
}