Je découpe un tableau de chaînes et le définit sur une [String]
variable, mais le vérificateur de type se plaint. Est-ce un bogue possible du compilateur?
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]
Réponses:
L'indexation d'un tableau avec une plage ne renvoie pas un tableau, mais une tranche. Vous pouvez cependant créer un tableau à partir de cette tranche.
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
var someTags = tags[1..<3] var someTagsArray: [String] = someTags
il vous donne le plus utileerror: 'Slice<String>' is not convertible to '[String]'
Vous pouvez également le faire pour obtenir un nouveau tableau de la tranche:
var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0]) //prints ["is", "cool"]
Une autre façon de faire cela en un seul endroit est de combiner la déclaration de variable let someTags: [String]
et map(_:)
, qui se transformera ArraySlice<String>
en [String]
:
let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
Un autre moyen pratique de convertir un ArraySlice
en Array
est le suivant:
var tags = ["this", "is", "cool"]
var someTags: [String] = tags[1..<3] + []
Ce n'est pas parfait car un autre développeur (ou vous-même) qui le regarde plus tard peut ne pas comprendre son objectif. La bonne nouvelle est que si ce développeur (peut-être vous) supprime le, + []
il rencontrera immédiatement une erreur de compilation, ce qui, espérons-le, clarifiera son objectif.
Il suffit de lancer la tranche en tant que matrice lors de sa création. Conserver votre tableau sous forme de tableau sans avoir à utiliser une variable intermédiaire. Cela fonctionne très bien lorsque vous utilisez des types codables.
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Slice
documenté? De plus, le message d'erreur est incorrect etSlice
s'affiche sous la forme [String] dans la cour de récréation. Il semble donc qu'il y ait deux erreurs de compilation et une documentation manquante.