2015-07-16 39 views
12

sto usando Xcode 6.4Convertire Swift Array al dizionario con gli indici

Ho una serie di UIViews e voglio convertire in un dizionario con le chiavi "v0", "v1".... Così:

var dict = [String:UIView]() 
for (index, view) in enumerate(views) { 
    dict["v\(index)"] = view 
} 
dict //=> ["v0": <view0>, "v1": <view1> ...] 

Questo funziona, ma sto cercando di farlo in uno stile più funzionale. Immagino che mi infastidisca il fatto che devo creare la variabile dict. Mi piacerebbe usare enumerate() e reduce() in questo modo:

reduce(enumerate(views), [String:UIView]()) { dict, enumeration in 
    dict["v\(enumeration.index)"] = enumeration.element // <- error here 
    return dict 
} 

Questo si sente più bello, ma sto ottenendo l'errore: Cannot assign a value of type 'UIView' to a value of type 'UIView?' Ho provato questo con oggetti altri un UIView (es: [String] -> [String:String]) e ottengo lo stesso errore.

Qualche suggerimento per la pulizia?

risposta

24

provare in questo modo:

reduce(enumerate(a), [String:UIView]()) { (var dict, enumeration) in 
    dict["\(enumeration.index)"] = enumeration.element 
    return dict 
} 

Xcode 8 • Swift 2,3

extension Array where Element: AnyObject { 
    var indexedDictionary: [Int:Element] { 
     var result: [Int:Element] = [:] 
     for (index, element) in enumerate() { 
      result[index] = element 
     } 
     return result 
    } 
} 

Xcode 8 • Swift 3,0

extension Array { 
    var indexedDictionary: [Int: Element] { 
     var result: [Int: Element] = [:] 
     enumerated().forEach({ result[$0.offset] = $0.element }) 
     return result 
    } 
} 
+0

non posso credere che questo lo fissa ! Hai idea del motivo per cui funziona? La maggior parte della documentazione che ho visto sulle chiusure ha omesso 'var' nei parametri. – Adam

+0

dict è una costante di default. Se vuoi cambiarlo devi dichiararlo come variabile. :) –

+1

Ah, questo ha perfettamente senso. Grazie mille, sono stato a questo per troppo tempo stasera :) – Adam

Problemi correlati