web-dev-qa-db-fra.com

Tableau à partir des clés du dictionnaire en rapide

Essayer de remplir un tableau avec des chaînes à partir des clés d'un dictionnaire dans Swift.

var componentArray: [String]

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

Ceci retourne une erreur de: 'AnyObject' pas identique à string

Aussi essayé

componentArray = dict.allKeys as String 

mais get: 'String' n'est pas convertible en [String]

203
Kyle Goslan

Swift 3 & Swift 4

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

componentArray = dict.allKeys // for NSDictionary
450

Avec Swift 3, Dictionary a une keys propriété. keys a la déclaration suivante:

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

Une collection contenant uniquement les clés du dictionnaire.

Notez que LazyMapCollection qui peut facilement être mappé sur un Array avec Array 's init(_:) initializer.


De NSDictionary à [String]

L'extrait de classe AppDelegate pour iOS suivant montre comment obtenir un tableau de chaînes ([String]) à l'aide de la propriété keys à partir d'une 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] à [String]

De manière plus générale, le code de Playground suivant montre comment obtenir un tableau de chaînes ([String]) à l'aide de la propriété keys à partir d'un dictionnaire avec des clés de chaîne et des valeurs entières ([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] à [String]

Le code de terrain de jeu suivant montre comment obtenir un tableau de chaînes ([String]) à l'aide de la propriété keys à partir d'un dictionnaire contenant des clés de nombre entier et des valeurs de chaîne ([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"]
48
Imanou Petit

Tableau à partir des clés du dictionnaire dans Swift

componentArray = [String] (dict.keys)
37
Santo

dict.allKeys n'est pas une chaîne. C'est un [String], exactement comme le message d'erreur vous l'indique (en supposant, bien sûr, que les clés sont toutes les chaînes; c'est exactement ce que vous affirmez quand vous dites cela).

Donc, commencez par taper componentArray en tant que [AnyObject], car c’est ainsi que l’API Cocoa est saisie, ou bien, si vous convertissez dict.allKeys, transmettez-le à [String], car c’est ainsi que vous avez saisi componentArray.

8
matt
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
    }
}
2
Jitesh Desai
2
Jlam

NSDictionary est Classe (passe par référence) NSDictionary is class type Dictionnaire est Structure (transmission par la valeur)  Dictionary is structure of key and value ====== Tableau de NSDictionary ======

NSDictionary a allKeys _ et allValues obtenir des propriétés avec Type [Any].  NSDictionary has get [Any] properties for allkeys and 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)

====== Tableau à partir du dictionnaire ====== 

Référence Apple pour Dictionnaire _ {clés _ et valeurs propriétés .  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)
2
Darshan Panchal

À partir du tableau officiel Apple :

init(_:) - Crée un tableau contenant les éléments d'une séquence.

Déclaration

Array.init<S>(_ s: S) where Element == S.Element, S : Sequence

Paramètres

s - Séquence d'éléments à transformer en tableau.

Discussion

Vous pouvez utiliser cet initialiseur pour créer un tableau à partir de tout autre type conforme au protocole de séquence ... Vous pouvez également utiliser cet initialiseur pour reconvertir une séquence complexe ou un type de collection en tableau. Par exemple, la propriété keys d'un dictionnaire n'est pas un tableau avec son propre stockage, c'est une collection qui mappe ses éléments à partir du dictionnaire uniquement lorsqu'ils sont consultés, ce qui permet d'économiser du temps et de l'espace. nécessaire d'allouer un tableau. Si vous devez toutefois transmettre ces clés à une méthode prenant un tableau, utilisez cet initialiseur pour convertir cette liste de son type LazyMapCollection<Dictionary<String, Int>, Int> to a simple [String].

func cacheImagesWithNames(names: [String]) {
    // custom image loading and caching
 }

let namedHues: [String: Int] = ["Vermillion": 18, "Magenta": 302,
        "Gold": 50, "Cerise": 320]
let colorNames = Array(namedHues.keys)
cacheImagesWithNames(colorNames)

print(colorNames)
// Prints "["Gold", "Cerise", "Magenta", "Vermillion"]"
0
Chris Graf

Cette réponse sera pour le dictionnaire Swift avec les clés de chaîne. Comme celui-ci ci-dessous .

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

Voici l'extension que je vais utiliser.

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

Et je récupérerai toutes les clés plus tard avec ça.

let componentsArray = dict.allKeys()
0
jnblanchard