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]
Swift 3 & Swift 4
componentArray = Array(dict.keys) // for Dictionary
componentArray = dict.allKeys // for NSDictionary
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.
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
:
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
}
[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"]
[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"]
Tableau à partir des clés du dictionnaire dans Swift
componentArray = [String] (dict.keys)
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
.
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
}
}
dict.keys.sorted()
qui donne [String] https://developer.Apple.com/documentation/Swift/array/2945003-sorted
NSDictionary est Classe (passe par référence) Dictionnaire est Structure (transmission par la valeur) ====== Tableau de NSDictionary ======
NSDictionary a allKeys _ et allValues obtenir des propriétés avec Type [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)
====== Tableau à partir du dictionnaire ======
Référence Apple pour Dictionnaire _ {clés _ et valeurs propriétés .
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)
À partir du tableau officiel Apple :
init(_:)
- Crée un tableau contenant les éléments d'une séquence.
Array.init<S>(_ s: S) where Element == S.Element, S : Sequence
s - Séquence d'éléments à transformer en tableau.
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"]"
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()