(斯威夫特3)
检查数组中是否存在元素(满足某些条件),如果是,则继续使用第一个这样的元素
意图是:
检查数组中是否存在元素(/满足一些布尔条件,不一定是等式测试),
如果是这样,继续使用第一个这样的元素,
然后另一个contains(_:)作为blueprinted Sequence 是first(where:)的 Sequence :
let elements = [1, 2, 3, 4, 5]
if let firstSuchElement = elements.first(where: { $0 == 4 }) {
print(firstSuchElement) // 4
// ...
}
在这个人为的例子中,它的用法看似愚蠢,但是如果查询非基本元素类型的数组是否存在满足某些条件的任何元素,则它非常有用 . 例如 .
struct Person {
let age: Int
let name: String
init(_ age: Int, _ name: String) {
self.age = age
self.name = name
}
}
let persons = [Person(17, "Fred"), Person(16, "Susan"),
Person(19, "Hannah"), Person(18, "Sarah"),
Person(23, "Sam"), Person(18, "Jane")]
if let eligableDriver = persons.first(where: { $0.age >= 18 }) {
print("\(eligableDriver.name) can possibly drive the rental car in Sweden.")
// ...
} // Hannah can possibly drive the rental car in Sweden.
let daniel = Person(18, "Daniel")
if let sameAgeAsDaniel = persons.first(where: { $0.age == daniel.age }) {
print("\(sameAgeAsDaniel.name) is the same age as \(daniel.name).")
// ...
} // Sarah is the same age as Daniel.
使用 .filter { ... some condition }.first 的任何链式操作都可以有利地替换为 first(where:) . 后者更好地显示了意图,并且具有优于 .filter 的可能的非延迟设备的性能优势,因为它们将在提取通过过滤器的(可能的)第一元素之前传递完整数组 .
检查数组中是否存在元素(满足某些条件),如果存在,则删除第一个此类元素
以下评论查询:
如何从阵列中删除firstSuchElement?
与上述类似的用例是删除满足给定谓词的第一个元素 . 为此,Collection的index(where:)方法(可供阵列集合使用)可用于查找满足谓词的第一个元素的索引,之后索引可与remove(at:)方法一起使用of Array to(可能;鉴于它存在)删除该元素 .
var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]
if let indexOfFirstSuchElement = elements.index(where: { $0 == "c" }) {
elements.remove(at: indexOfFirstSuchElement)
print(elements) // ["a", "b", "d", "e", "a", "b", "c"]
}
或者,如果您要从数组中删除元素并使用,请将 Optional :s map(_:)方法有条件地应用(对于 .some(...) 从 index(where:) 返回),使用 index(where:) 的结果从数组中删除并捕获已删除的元素(在可选的绑定子句) .
var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]
if let firstSuchElement = elements.index(where: { $0 == "c" })
.map({ elements.remove(at: $0) }) {
// if we enter here, the first such element have now been
// remove from the array
print(elements) // ["a", "b", "d", "e", "a", "b", "c"]
// and we may work with it
print(firstSuchElement) // c
}
请注意,在上面的设计示例中,数组成员是简单的值类型( String 实例),因此使用谓词来查找给定成员有点过度,因为我们可能只是使用更简单的 index(of:) 方法测试相等性,如@DogCoffee's answer所示 . 但是,如果将上述查找和删除方法应用于 Person 示例,则使用带有谓词的 index(where:) 是合适的(因为我们不再测试相等性,而是为了实现提供的谓词) .