(Swift 3)
Periksa apakah ada elemen dalam array (memenuhi beberapa kriteria), dan jika demikian, lanjutkan bekerja dengan elemen tersebut pertama
Jika tujuannya adalah:
- Untuk memeriksa apakah suatu elemen ada dalam array (/ memenuhi beberapa kriteria boolean, belum tentu pengujian kesetaraan),
- Dan jika demikian, lanjutkan dan bekerja dengan elemen seperti pertama,
Maka alternatif untuk contains(_:)
sebagai cetak biru Sequence
adalah first(where:)
dari Sequence
:
let elements = [1, 2, 3, 4, 5]
if let firstSuchElement = elements.first(where: { $0 == 4 }) {
print(firstSuchElement) // 4
// ...
}
Dalam contoh yang dibuat-buat ini, penggunaannya mungkin tampak konyol, tetapi sangat berguna jika permintaan array tipe elemen non-fundamental untuk keberadaan elemen yang memenuhi beberapa persyaratan. Misalnya
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.
Setiap operasi berantai menggunakan .filter { ... some condition }.first
dapat diganti dengan baik first(where:)
. Yang terakhir menunjukkan niat yang lebih baik, dan memiliki keunggulan kinerja lebih dari peralatan yang tidak malas .filter
, karena ini akan melewati array penuh sebelum mengekstraksi elemen (mungkin) pertama yang melewati filter.
Periksa apakah ada elemen dalam array (memenuhi beberapa kriteria), dan jika demikian, hapus elemen pertama
Komentar di bawah pertanyaan:
Bagaimana saya bisa menghapus firstSuchElement
dari array?
Kasus penggunaan yang mirip dengan yang di atas adalah untuk menghapus elemen pertama yang memenuhi predikat yang diberikan. Untuk melakukannya, index(where:)
metode Collection
(yang sudah tersedia untuk koleksi array) dapat digunakan untuk menemukan indeks elemen pertama yang memenuhi predikat, kemudian indeks dapat digunakan dengan remove(at:)
metode Array
to (mungkin; mengingat bahwa itu ada) hapus elemen itu.
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"]
}
Atau, jika Anda ingin menghapus elemen dari array dan bekerja dengannya , terapkan metode Optional
: s map(_:)
untuk bersyarat (untuk .some(...)
kembali dari index(where:)
) gunakan hasil dari index(where:)
untuk menghapus dan menangkap elemen yang dihapus dari array (dalam klausa penjilidan opsional) .
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
}
Perhatikan bahwa dalam contoh yang dibuat di atas anggota array adalah tipe nilai sederhana ( String
instance), jadi menggunakan predikat untuk menemukan anggota tertentu agak terlalu mematikan, karena kami mungkin hanya menguji kesetaraan menggunakan index(of:)
metode yang lebih sederhana seperti yang ditunjukkan pada jawaban @ DogCoffee . Jika menerapkan pendekatan temukan-dan-hilangkan di atas untuk Person
contoh, bagaimanapun, menggunakan index(where:)
dengan predikat adalah tepat (karena kami tidak lagi menguji kesetaraan tetapi untuk memenuhi predikat yang disediakan).
if find(elements, 5) != nil { }
tidak cukup baik