(スイフト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
アレイからを削除するにはどうすればよいですか?
上記と同様の使用例は、特定の述語を満たす最初の要素を削除することです。これを行うにはindex(where:)
、Collection
(配列のコレクションですぐに使用できる)メソッドを使用して、述語を満たす最初の要素のインデックスを見つけます。その後、インデックスremove(at:)
は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の回答に示されているように、単純なメソッドを使用して等価性をテストするだけなので、述語を使用して特定のメンバーを見つけるのはやややりすぎです。。Person
ただし、上記の検索と削除のアプローチを例に適用する場合index(where:)
は、述語と一緒に使用するのが適切です(等価性のテストは行われず、指定された述語を満たすため)。
if find(elements, 5) != nil { }
十分ではありませんか?