Swift 4'ten bu yana bunu çok kolay bir şekilde yapabilirsiniz. Vardır , iki yeni dizilerini bir dizisinden (anahtar ve değer çiftleri) bir sözlük oluşturmak ilklendiriciler. Anahtarların benzersiz olduğu garanti ediliyorsa, aşağıdakileri yapabilirsiniz:
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"]
Herhangi bir anahtar kopyalanırsa, bu bir çalışma zamanı hatasıyla başarısız olur. Bu durumda bu sürümü kullanabilirsiniz:
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"]
Bu sizin for döngüsü gibi davranır. Değerlerin "üzerine yazmak" ve ilk eşlemeye bağlı kalmak istemiyorsanız, şunu kullanabilirsiniz:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2 , sıralama öğelerini bir sözlüğe gruplayan üçüncü bir başlatıcı ekler . Sözlük anahtarları bir kapanışla türetilir. Aynı anahtara sahip öğeler, sırayla aynı sırayla bir diziye yerleştirilir. Bu, yukarıdaki gibi benzer sonuçlar elde etmenizi sağlar. Örneğin:
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]
yoksa[position:[name]]
? Aynı pozisyonda iki kişi varsa, sözlüğünüz yalnızca son karşılaşılanı döngünüzde tutacaktır .... Benzer bir sorum var ve çözüm bulmaya çalışıyorum ama sonucun şöyle olmasını istiyorum[1: [p1, p3], 2: [p2]]