(Hızlı 3)
Bir dizide bir öğenin var olup olmadığını kontrol edin (bazı kriterleri karşılayan) ve eğer öyleyse, bu tür ilk elemanla çalışmaya devam edin
Amaç:
- Bir öğenin bir dizide var olup olmadığını kontrol etmek (/ mutlaka eşitlik testi yerine bazı boole ölçütlerini karşılar),
- Ve eğer öyleyse, bu tür ilk unsurla devam edin ve çalışın,
Daha sonra bir alternatif contains(_:)
blueprinted olarak Sequence
etmektir first(where:)
arasında Sequence
:
let elements = [1, 2, 3, 4, 5]
if let firstSuchElement = elements.first(where: { $0 == 4 }) {
print(firstSuchElement) // 4
// ...
}
Bu çelişkili örnekte kullanımı aptalca görünebilir, ancak temel olmayan eleman türlerinin dizilerini bir koşulu yerine getiren herhangi bir öğenin varlığı için sorgulamak çok yararlıdır. Örneğin
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.
Herhangi bir zincirleme işlem .filter { ... some condition }.first
uygun şekilde değiştirilebilir first(where:)
. İkincisi amacı daha iyi gösterir ve tembel olmayan cihazlara göre performans avantajlarına sahiptir .filter
, çünkü bunlar filtreden geçen (olası) birinci elemanı çıkarmadan önce tam diziyi geçecektir.
Bir dizide bir öğenin var olup olmadığını kontrol edin (bazı kriterleri karşılayan) ve eğer öyleyse, bu tür ilk elemanı kaldırın
Sorguların altındaki bir yorum:
Diziden nasıl kaldırabilirim firstSuchElement
?
Yukarıdakine benzer bir kullanım durumu, belirli bir yüklemi yerine getiren ilk elemanı çıkarmaktır . Bunu yapmak için, (dizi toplama için kolayca kullanılabilir) index(where:)
yöntemi Collection
yüklemi yerine getiren ilk elemanın dizinini bulmak için kullanılabilir, daha sonra endeks, (olası; var olduğu göz önüne alındığında) remove(at:)
yöntemi ile kullanılabilir Array
(mümkün; o elemanı kaldır.
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"]
}
Veya öğeyi diziden kaldırmak ve ile çalışmak isterseniz, kaldırılan öğeyi diziden kaldırmak ve yakalamak için (isteğe bağlı bir bağlama yan tümcesi içinde) sonucu koşullu olarak ( dönüş için ) uygulamak için Optional
: s map(_:)
yöntemini uygulayın. ..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
}
Yukarıdaki örnekte dizi üyelerinin basit değer türleri ( String
örnekler) olduğuna dikkat edin, bu nedenle belirli bir üyeyi bulmak için bir yüklem kullanmanın biraz fazla öldürme olduğunu unutmayın, çünkü @ DogCoffee'nin cevabındaindex(of:)
gösterildiği gibi daha basit yöntemi kullanarak eşitliği test edebiliriz . Bununla birlikte, yukarıdaki bul ve kaldır yaklaşımını örneğe uyguluyorsanız, bir yüklem ile kullanmak uygundur (çünkü artık eşitliği test etmiyoruz, ancak verilen bir yüklemi yerine getirmek için).Person
index(where:)
if find(elements, 5) != nil { }
yeterince iyi değil mi?