(स्विफ्ट 3)
जांचें कि क्या कोई तत्व किसी सरणी में मौजूद है (कुछ मानदंडों को पूरा करते हुए), और यदि ऐसा है, तो पहले ऐसे तत्व के साथ काम करें
यदि आशय है:
- यह जाँचने के लिए कि कोई तत्व किसी सरणी में मौजूद है (/ कुछ बूलियन मानदंडों को पूरा करता है, जरूरी नहीं कि समानता परीक्षण हो),
- और यदि ऐसा है, तो आगे बढ़ें और पहले ऐसे तत्व के साथ काम करें,
फिर contains(_:)
ब्लूप्रिंट के रूप में एक विकल्प इसके 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
(जो सरणी संग्रह करने के लिए आसानी से उपलब्ध है) पहला तत्व विधेय को पूरा करने, whereafter सूचकांक के साथ इस्तेमाल किया जा सकता के सूचकांक को खोजने के लिए इस्तेमाल किया जा सकता remove(at:)
की विधि Array
के लिए (संभव; यह देखते हुए कि वह मौजूद है) उस तत्व को हटा दें।
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
: 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:)
पद्धति जैसा कि @ डॉगफिश के उत्तर में दिखाया गया है। । यदि Person
उदाहरण के ऊपर खोज-और-हटाने के दृष्टिकोण को लागू करना , हालांकि, index(where:)
एक विधेय के साथ उपयोग करना उचित है (क्योंकि हम अब समानता के लिए परीक्षण नहीं करते हैं, लेकिन आपूर्ति की गई विधेय को पूरा करने के लिए)।
if find(elements, 5) != nil { }
बहुत अच्छा नहीं है?