ios - arreglo - Array de claves del diccionario en swift
string array in swift 3 (8)
Array de claves del diccionario en Swift
componentArray = [String] (dict.keys)
Tratar de llenar una matriz con cadenas de las claves en un diccionario de forma rápida.
var componentArray: [String]
let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Components", ofType: "plist")!)
componentArray = dict.allKeys
Esto devuelve un error de: ''AnyObject'' no idéntico a la cadena
Tambien intentado
componentArray = dict.allKeys as String
pero obtén: ''String'' no es convertible a [String]
Con Swift 3, Dictionary
tiene una propiedad de keys
. keys
tienen la siguiente declaración:
var keys: LazyMapCollection<Dictionary<Key, Value>, Key> { get }
Una colección que contiene solo las claves del diccionario.
Tenga en cuenta que LazyMapCollection
se puede asignar fácilmente a un Array
con el init(_:)
Array
.
De NSDictionary
a [String]
El siguiente fragmento de clase de AppDelegate
iOS muestra cómo obtener una matriz de cadenas ( [String]
) usando la propiedad keys
de un NSDictionary
:
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 una manera más general, el siguiente código de Zona de juegos muestra cómo obtener una matriz de cadenas ( [String]
) usando la propiedad de keys
de un diccionario con claves de cadena y valores enteros ( [String: Int]
) [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 Zona de juegos muestra cómo obtener una matriz de cadenas ( [String]
) usando la propiedad de keys
de un diccionario con claves de enteros 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"]
Esta respuesta será para el diccionario rápido con teclas de cadena. Como esta abajo .
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()
Swift 3 y Swift 4
componentArray = Array(dict.keys) // for Dictionary
componentArray = dict.allKeys // for NSDictionary
dict.allKeys
no es una cadena. Es una [String]
, exactamente como lo indica el mensaje de error (asumiendo, por supuesto, que las claves son todas las cadenas; esto es exactamente lo que está afirmando cuando dice eso).
Entonces, empiece por escribir componentArray
como [AnyObject]
, porque así se escribe en la API de Cocoa, o bien, si lanza dict.allKeys
, dict.allKeys
a [String]
, porque así es como ha escrito componentArray
.
NSDictionary es Clase (pase por referencia) Diccionario es Estructura (pasar por valor ) ====== Array from NSDictionary ======
NSDictionary tiene allKeys y allValues obtienen propiedades con el tipo [Any] .
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 del Diccionario .
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)
dict.keys.sorted()
que da [String] https://developer.apple.com/documentation/swift/array/2945003-sorted
extension Array {
public func toDictionary<Key: Hashable>(with selectKey: (Element) -> Key) -> [Key:Element] {
var dict = [Key:Element]()
for element in self {
dict[selectKey(element)] = element
}
return dict
}
}