Kể từ Swift 4, bạn có thể làm điều này rất dễ dàng. Có hai trình khởi tạo mới xây dựng từ điển từ một chuỗi các bộ giá trị (cặp khóa và giá trị). Nếu các khóa được đảm bảo là duy nhất, bạn có thể làm như sau:
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"]
Điều này sẽ không thành công với lỗi thời gian chạy nếu bất kỳ khóa nào bị trùng lặp. Trong trường hợp đó, bạn có thể sử dụng phiên bản này:
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"]
Điều này hoạt động như vòng lặp for của bạn. Nếu bạn không muốn "ghi đè" các giá trị và dính vào ánh xạ đầu tiên, bạn có thể sử dụng điều này:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2 thêm trình khởi tạo thứ ba để nhóm các phần tử trình tự vào một từ điển. Các khóa từ điển được tạo ra bởi một bao đóng. Các phần tử có cùng khóa được đưa vào một mảng theo thứ tự như trong dãy. Điều này cho phép bạn đạt được kết quả tương tự như trên. Ví dụ:
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]
hay[position:[name]]
không? Nếu bạn có hai người ở cùng một vị trí, từ điển của bạn sẽ chỉ giữ lại người cuối cùng gặp phải trong vòng lặp của bạn .... Tôi có một câu hỏi tương tự mà tôi đang cố gắng tìm giải pháp, nhưng tôi muốn kết quả như thế nào[1: [p1, p3], 2: [p2]]