Matriz de teclas del diccionario en swift

Intentando llenar una matriz con cadenas de las teclas en un diccionario rápido.

var componentArray: [String] let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Components", ofType: "plist")!) componentArray = dict.allKeys 

Esto devuelve un error de: ‘AnyObject’ no es idéntico a la cadena

También probado

 componentArray = dict.allKeys as String 

pero consigue: ‘String’ no es convertible a [String]

Swift 3 y Swift 4

 componentArray = Array(dict.keys) // for Dictionary componentArray = dict.allKeys // for NSDictionary 

Con Swift 3, Dictionary tiene una propiedad de keys . keys tiene la siguiente statement:

 var keys: LazyMapCollection, Key> { get } 

Una colección que contiene solo las teclas del diccionario.

Tenga en cuenta que LazyMapCollection se puede asignar fácilmente a una Array con el init(_:) Array .


De NSDictionary a [String]

El siguiente fragmento de clase AppDelegate iOS muestra cómo obtener una matriz de cadenas ( [String] ) usando la propiedad keys de un NSDictionary :

enter image description here

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let string = Bundle.main.path(forResource: "Components", ofType: "plist")! if let dict = NSDictionary(contentsOfFile: string) as? [String : Int] { let lazyMapCollection = dict.keys let componentArray = Array(lazyMapCollection) print(componentArray) // prints: ["Car", "Boat"] } return true } 

De [String: Int] a [String]

De manera más general, el siguiente código de Playground muestra cómo obtener una matriz de cadenas ( [String] ) usando la propiedad keys de un diccionario con claves de cadena y valores enteros ( [String: Int] ):

 let dictionary = ["Gabrielle": 49, "Bree": 32, "Susan": 12, "Lynette": 7] let lazyMapCollection = dictionary.keys let stringArray = Array(lazyMapCollection) print(stringArray) // prints: ["Bree", "Susan", "Lynette", "Gabrielle"] 

De [Int: String] a [String]

El siguiente código de Playground muestra cómo obtener una matriz de cadenas ( [String] ) usando la propiedad keys de un diccionario con claves enteras y valores de cadena ( [Int: String] ):

 let dictionary = [49: "Gabrielle", 32: "Bree", 12: "Susan", 7: "Lynette"] let lazyMapCollection = dictionary.keys let stringArray = Array(lazyMapCollection.map { String($0) }) // let stringArray = Array(lazyMapCollection).map { String($0) } // also works print(stringArray) // prints: ["32", "12", "7", "49"] 

Matriz de teclas del diccionario en Swift

 componentArray = [String] (dict.keys) 

dict.allKeys no es una cadena. Es un [String] , exactamente como lo dice el mensaje de error (asumiendo, por supuesto, que las claves son todas cadenas, esto es exactamente lo que está afirmando cuando dice eso).

Entonces, o bien empiece escribiendo componentArray como [AnyObject] , porque así es como se tipea en la API de Cocoa, o bien, si lanza dict.allKeys , dict.allKeys a [String] , porque así es como ha escrito componentArray .

 extension Array { public func toDictionary(with selectKey: (Element) -> Key) -> [Key:Element] { var dict = [Key:Element]() for element in self { dict[selectKey(element)] = element } return dict } } 

NSDictionary es Clase (pase por referencia) NSDictionary es tipo de clase El diccionario es Estructura (paso por valor ) El diccionario es estructura de clave y valor ====== Matriz de NSDictionary ======

NSDictionary tiene allKeys y allValues obtienen propiedades con el tipo [Cualquiera] . NSDictionary tiene propiedades [Any] para allkeys y allvalues

  let objesctNSDictionary = NSDictionary.init(dictionary: ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"]) let objectArrayOfAllKeys:Array = objesctNSDictionary.allKeys let objectArrayOfAllValues:Array = objesctNSDictionary.allValues print(objectArrayOfAllKeys) print(objectArrayOfAllValues) 

====== Array From Dictionary ======

Referencia de Apple para las propiedades de claves y valores de Dictionary . enter image description here

enter image description here

 let objectDictionary:Dictionary = ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"] let objectArrayOfAllKeys:Array = Array(objectDictionary.keys) let objectArrayOfAllValues:Array = Array(objectDictionary.values) print(objectArrayOfAllKeys) print(objectArrayOfAllValues) 

Esta respuesta será para diccionario rápido w / String keys. Como este a continuación .

 let dict: [String: Int] = ["hey": 1, "yo": 2, "sup": 3, "hello": 4, "whassup": 5] 

Aquí está la extensión que usaré.

 extension Dictionary { func allKeys() -> [String] { guard self.keys.first is String else { debugPrint("This function will not return other hashable types. (Only strings)") return [] } return self.flatMap { (anEntry) -> String? in guard let temp = anEntry.key as? String else { return nil } return temp } } } 

Y obtendré todas las llaves más tarde usando esto.

 let componentsArray = dict.allKeys()