(รวดเร็ว 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
(ซึ่งพร้อมใช้งานในการเก็บอาร์เรย์) อาจใช้เพื่อค้นหาดัชนีขององค์ประกอบแรกที่ตอบสนองเพรดิเคตซึ่งดัชนีสามารถใช้กับ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
: 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 { }
ยังไม่ดีพอ