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?
3 Réponses :
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)
}
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.
À la place, vous devriez utiliser Dans ce cas particulier, ce code est encore mieux exprimé en utilisant un simple 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. 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 }
Array.flatMap (_ :) opération: let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
dwarfArray.append(contentsOf: dwarfName)
}
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"]