ตั้งแต่Swift 4คุณสามารถทำได้อย่างง่ายดาย มีตัวเริ่มต้นใหม่สอง ตัวที่สร้างพจนานุกรมจากลำดับของทูเปิล (คู่ของคีย์และค่า) หากรับประกันว่าคีย์ไม่ซ้ำกันคุณสามารถดำเนินการดังต่อไปนี้:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 3)]
Dictionary(uniqueKeysWithValues: persons.map { ($0.position, $0.name) })
=> [1: "Franz", 2: "Heinz", 3: "Hans"]
สิ่งนี้จะล้มเหลวด้วยข้อผิดพลาดรันไทม์หากคีย์ใด ๆ ซ้ำกัน ในกรณีนี้คุณสามารถใช้เวอร์ชันนี้:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 1)]
Dictionary(persons.map { ($0.position, $0.name) }) { _, last in last }
=> [1: "Hans", 2: "Heinz"]
สิ่งนี้จะทำงานเป็นห่วงของคุณ หากคุณไม่ต้องการ "เขียนทับ" ค่าและยึดติดกับการแมปแรกคุณสามารถใช้สิ่งนี้:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2เพิ่มinitializer ตัวที่สามที่จัดกลุ่มองค์ประกอบตามลำดับลงในพจนานุกรม คีย์พจนานุกรมได้มาจากการปิด องค์ประกอบที่มีคีย์เดียวกันจะถูกใส่ลงในอาร์เรย์ในลำดับเดียวกันกับในลำดับ สิ่งนี้ช่วยให้คุณได้ผลลัพธ์ที่คล้ายกันดังข้างต้น ตัวอย่างเช่น:
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.last! }
=> [1: Person(name: "Hans", position: 1), 2: Person(name: "Heinz", position: 2)]
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.first! }
=> [1: Person(name: "Franz", position: 1), 2: Person(name: "Heinz", position: 2)]
[position:name]
หรือ[position:[name]]
? หากคุณมีสองคนในตำแหน่งเดียวกันพจนานุกรมของคุณจะเก็บเฉพาะคนสุดท้ายที่พบในวงของคุณเท่านั้น .... ฉันมีคำถามคล้าย ๆ กันซึ่งฉันกำลังพยายามหาทางแก้ไข แต่ฉันต้องการให้ผลลัพธ์เป็นเช่นนั้น[1: [p1, p3], 2: [p2]]