Swift 2: separar una matriz en un dictionary con keys de la A a la Z

Tengo una matriz, por ejemplo ["Apple", "Banana", "Blueberry", "Eggplant"] y me gustaría convertirlo a un dictionary como sigue:

 [ "A" : ["Apple"], "B" : ["Banana", "Blueberry"], "C" : [], "D" : [], "E" : ["Eggplant"] ] 

Estoy usando Swift 2 en Xcode 7 beta 4. ¡Gracias!

Utilizando solo los objects y methods de Swift 2, y con una tecla para cada letra del alfabeto:

 let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.map({ String($0) }) let words = ["Apple", "Banana", "Blueberry", "Eggplant"] var result = [String:[String]]() for letter in alphabet { result[letter] = [] let matches = words.filter({ $0.hasPrefix(letter) }) if !matches.isEmpty { for word in matches { result[letter]?.append(word) } } } print(result) 

Compuse esto en el parque infantil Xcode:

 import Foundation var myArray = ["Apple", "Banana", "Blueberry", "Eggplant"] var myDictionary : NSMutableDictionary = NSMutableDictionary() for eachString in myArray as [NSString] { let firstCharacter = eachString.substringToIndex(1) var arrayForCharacter = myDictionary.objectForKey(firstCharacter) as? NSMutableArray if arrayForCharacter == nil { arrayForCharacter = NSMutableArray() myDictionary.setObject(arrayForCharacter!, forKey: firstCharacter) } arrayForCharacter!.addObject(eachString) } for eachCharacter in myDictionary.allKeys { var arrayForCharacter = myDictionary.objectForKey(eachCharacter) as! NSArray print("for character \(eachCharacter) the array is \(arrayForCharacter)") } 

Esta es mi solucion Funciona en Swift 2 puro y en O (n) time donde n es la longitud de la list de palabras (y suponiendo que un dictionary se implementa como una tabla hash).

 var dictionary: [String : [String]] = [ "A" : [], "B" : [], "C" : [], "D" : [], "E" : [], "F" : [] /* etc */ ] let words = ["Apple", "Banana", "Blueberry", "Eggplant"] for word in words { let firstLetter = String(word[word.startIndex]).uppercaseString if let list = dictionary[firstLetter] { dictionary[firstLetter] = list + [word] } else { print("I'm sorry I can't do that Dave, with \(word)") } } print("\(dictionary)") 

Encontré esta pregunta que me ayudó a comprender mejor algunos conceptos en los que había estado pensando. Aquí hay una toma alternativa basada en la respuesta correcta aceptada, que es un poco más concisa y donde el alfabeto se genera mediante progtwigción. Esto es Swift 2 en Xcode 7.

 let words = ["Apple", "Banana", "Blueberry", "Eggplant"] let alphabet = (0..<26).map {n in String(UnicodeScalar("A".unicodeScalars["A".unicodeScalars.startIndex].value + n))} var results = [String:[String]]() for letter in alphabet { results[letter] = words.filter({$0.hasPrefix(letter)}) } print(results) 

Creo, pero no estoy seguro de que la línea let alphabet sea ​​más concisa.