2016-04-19 16 views
0

Ich möchte ein unveränderliches Wörterbuch aus einem Array von Strukturen erstellen. Gibt es eine Möglichkeit, dies direkt in der Sprache zu tun? Ich weiß, dass es über ein temporäres veränderbares Wörterbuch erfolgen kann.Unveränderliche Wörterbuchinitialisierung in swift

class Foo { 
    let key: Int 
// ... other stuff 
    init(key:Int){ self.key = key } 
} 

let listOfFoos : [Foo] = [] 

var dict = [Int:Foo]() 
for foo in listOfFoos { dict[foo.key] = foo } 
let immutableDict = dict 

oder durch NSDictionary verwenden, wenn Foo ein Objekt

let immutableDict2 : [Int:Foo] = NSDictionary(objects:listOfFoos, forKeys: listOfFoos.map{$0.key}) as! [Int:Foo] 
+0

Soweit ich weiß, kann es nicht getan werden. Umgehung: Erstellen Sie eine Funktion zum Zurückgeben eines Wörterbuchs. Erstellen Sie im Wörterbuch ein veränderbares Wörterbuch und geben Sie es dann zurück – user1046037

Antwort

1

Obwohl tut Swift bisher keine Funktionalität für Wörterbücher unter Umgehung eines wandelbaren Wörterbuch konstruieren, können Sie es in einem Verschluss ohne Schleife tun könnte, wie dies:

static let listOfFoos : [Foo] = [Foo(1), Foo(2), Foo(3)] 

static let dict = {() -> [Int:Foo] in 
    var res = [Int:Foo]() 
    listOfFoos.forEach({foo in res[foo.key] = foo}) 
    return res 
}() 

diese Syntax etwas schwierig ist, hier so eine kurze Erklärung:

  • () -> [Int:Foo] { ... } einen parameter Verschluss erstellt, die ein Wörterbuch [Int:Foo]
  • var res = [Int:Foo]() schafft einen wandelbar Wörterbuch erzeugt, die später zu einer unveränderlichen Variable dict
  • zugeordnet listOfFoos.forEach({foo in res[foo.key] = foo}) ersetzt Ihre for Schleife
  • () nach dem Schließen geschweifte Klammer ruft die Schließung sofort auf und erzeugt das Ergebnis zur Initialisierungszeit.
+3

Warum 'reduce', warum nicht' forEach'? Sie werden definitiv nicht so "reduce" verwenden. – Sulthan

+0

@Sulthan behoben. Vielen Dank! – dasblinkenlight

+0

Es kann mit reduced als concise geschrieben werden: let dict = listOfFoos.reduce ([:]) {$ 0 [$ 1.key] = $ 1} –

Verwandte Themen