Conjunto de keys de dictionary en swift

Tratando de llenar rápidamente una matriz con cadenas de las keys en un dictionary.

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 string

También intentado

 componentArray = dict.allKeys as String 

pero get: 'String' no es convertible a [String]

Swift 3

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

Conjunto de keys de dictionary en Swift

 componentArray = [String] (dict.keys) 

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

 var keys: LazyMapCollection<Dictionary<Key, Value>, Key> { get } 

Una colección que contiene solo las keys del dictionary.

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


De NSDictionary a [String]

El siguiente fragment de class de iOS AppDelegate muestra cómo get una matriz de cadenas ( [String] ) utilizando las keys propiedad de un NSDictionary :

introduzca la descripción de la imagen aquí

 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 get una matriz de cadenas ( [String] ) usando las keys propiedad de un dictionary con keys de cadena y valores integers ( [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 get una matriz de cadenas ( [String] ) usando keys properties de las keys de un dictionary con keys 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"] 

dict.allKeys no es una cadena. Es un [String] , exactamente como lo indica el post de error (suponiendo, por supuesto, que las keys son todas cadenas; esto es exactamente lo que estás afirmando cuando dices eso).

Por lo tanto, comience por escribir componentArray como [AnyObject] , porque así es como se escribe en Cocoa API, o bien, si dict.allKeys , dict.allKeys a [String] , porque así es como escribió componentArray .

 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 } }