2
votes

Problème d'accès aux éléments dans un tableau de tableaux dans Swift

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
    dwarfArray.append(dwarfName)
}
All I'm trying to do is access the values of the original array of arrays and append them to a new, single array. But I keep getting this error:Cannot convert value of type '[String]' to expected argument type 'String'In the simplest of terms, what am I doing wrong?

0 commentaires

3 Réponses :


1
votes

C'est arrivé parce que dwarfArray est un tableau de chaînes et s'attend à ce qu'une chaîne soit ajoutée. Cependant, il obtient un tableau de chaîne au lieu de simplement string.

Essayez comme ceci

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
    dwarfArray.append(contentsOf: dwarfName)
}


1 commentaires

Techniquement correct, mais il est beaucoup préférable d’utiliser simplement append (contentsOf :) . D'une part, il ne fait que des opérations de redimensionnement, alors que ce code peut effectuer n'importe quel nombre de redimensionnements.



1
votes

Array.append (_ :) attend un argument de type Element , qui n'est qu'un seul élément. Evidemment, fournir un [String] comme argument à ce paramètre ne fonctionnerait que si Element est [String] , c'est-à-dire si le tableau était de type [[String]] . Comme ce n'est pas le cas, Array.append (_ :) n'est pas le bon choix.

À la place, vous devriez utiliser Array.append (contentsOf :) , qui attend un argument de type S code >, où S est tout type conforme de Sequence dont Element est le même que l'élément du tableau. Cela convient lorsque vous souhaitez ajouter tous les éléments d'un sous-tableau (dwarfName).

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
let dwarfArray = arrayOfDwarfArrays.flatMap { $0 }

Dans ce cas particulier, ce code est encore mieux exprimé en utilisant un simple Array.flatMap (_ :) opération:

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
    dwarfArray.append(contentsOf: dwarfName)
}


0 commentaires

1
votes

Inutile de réinventer la roue. Vous pouvez utiliser une méthode d'instance de séquence appelée join () . Il renverra un FlattenCollection > que vous pouvez utiliser pour initialiser un nouveau tableau si nécessaire:

let dwarfs = Array(dwarfCollections.joined())  // ["Sleepy", "Grumpy", "Doc", "Thorin", "Nori"]
print(dwarfs)

Si vous devez créer un nouveau tableau il suffit de l'initialiser avec les éléments de la collection flatten:

let dwarfCollections = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

// Use 'joined()' to access each element of each collection:
for dwarf in dwarfCollections.joined() {
    print(dwarf)
}

Cela imprimera

Somnolent

Grincheux

Doc

Thorin

Nori

["Sleepy", "Grumpy", "Doc", "Thorin", "Nori"]


0 commentaires