Je suis nouveau sur Swift, je pratique actuellement quelques trucs de base, quand j'essaie de comprendre pourquoi le contenu du dictionnaire n'est pas ordonné, j'ai trouvé une réponse dans le post de quelqu'un, la solution est d'ajouter un index avant, comme ceci:

[Int [String, String]]

Quand j'ai essayé de le tester, il y a une erreur à propos de

expression type '[Dictionary<Int, Dictionary<String, Int>>]' is ambiguous without more context

Aucune idée de ce qui ne va pas, alors je vais juste montrer le code et chercher de l'aide.

var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]

for (key, (animal, num)) in animalNumbers {
    print ("\(animal) = \(num)")
}
6
zhuqh93 14 août 2017 à 09:20

2 réponses

Meilleure réponse

Je suppose que vous avez peut-être mal compris cette suggestion concernant la clé numérique.

Tout d'abord, prenons du recul. Je suppose que votre dictionnaire d'origine était le suivant et que vous essayiez de résoudre le problème que l'ordre n'était pas conservé:

let animals = ["Cat": 1, "Dog": 10, "Aye-Aye": 98]

Et je soupçonne que vous avez lu cette autre réponse et que vous avez conclu que vous deviez la convertir en:

let animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]

C'est un tableau de dictionnaires imbriqués, chaque dictionnaire ayant une clé numérique. Mais cela n'a pas de sens. Vous résolvez le problème deux fois. C'est un tableau ordonné de dictionnaires, et la clé numérique fournit également un mécanisme pour récupérer les valeurs dans un ordre particulier. C'est redondant.

L'idée de la clé numérique est d'en faire un dictionnaire dont la clé est une valeur numérique, et dont les valeurs sont, elles-mêmes, des dictionnaires. Si vous faisiez cela, c'est plus simple que ce que vous avez là-bas, mais simplement:

let animalNumbers = [0: ["Cat": 1], 1: ["Dog": 10], 2: ["Aye-Aye": 98]]

Notez que c'est un dictionnaire avec une clé numérique, [Int: [String: Int]]. Quoi qu'il en soit, une fois que vous avez ce dictionnaire, vous pouvez théoriquement faire:

for i in 0 ..< animalNumbers.count {
    for (name, value) in animalNumbers[i]! {
        print(name, value)
    }
}

Mais, après avoir procédé à une ingénierie inverse de ce que je soupçonne que cette autre réponse suggérait, je dois dire que ce n'est vraiment pas un très bon modèle. Si vous souhaitez insérer des valeurs, vous devez vivre un cauchemar de reconstruction de toutes ces touches numériques.

Au lieu de cela, utilisez simplement un simple tableau de dictionnaires, [[String: Int]], qui est ordonné, mais élimine de nombreux problèmes introduits avec cette clé numérique construite manuellement:

let animals = [["Cat": 1], ["Dog": 10], ["Aye-Aye": 98]]

Ensuite vous pouvez:

for dictionary in animals {
    for (name, value) in dictionary {
        print(name, value)
    }
}

Enfin, mieux encore, vous ne devriez pas avoir affaire à des tableaux de dictionnaires, mais plutôt à un tableau de types personnalisés:

struct Animal {
    let name: String
    let value: Int
}

let animals = [
    Animal(name: "Cat", value: 1),
    Animal(name: "Dog", value: 10),
    Animal(name: "Aye-Aye", value: 98)
]

Maintenant que vous avez affaire au type [Animal], vous pouvez simplement:

for animal in animals {
    print(animal.name, animal.value)
}
2
Rob 14 août 2017 à 07:32

Fais-le comme ça-

var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]

        for animal in animalNumbers {
            for (animalName, num) in animal
            {
                print ("\(animalName) = \(num)")
            }
        }
0
Abhishek Jain 14 août 2017 à 06:31