Dans Swift, le type de retour de découpage Array [String] ne semble pas être [String]

87

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]

capture d'écran

Liron Shapira
la source

Réponses:

169

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)
Connor
la source
3
Où trouvez-vous Slicedocumenté? De plus, le message d'erreur est incorrect et Slices'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.
zaph le
1
Vous pouvez voir la définition de la méthode subscipt ici: developer.apple.com/library/prerelease/ios/documentation/…
Connor
2
Je reconnais que l'erreur est incorrecte et que la documentation pourrait nécessiter du travail. Si vous l'essayez en deux étapes: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsil vous donne le plus utileerror: 'Slice<String>' is not convertible to '[String]'
Connor
Ma faute, j'ai regardé les iBooks Swift. Je pense qu'Apple devrait les supprimer ou les maintenir à jour.
zaph
1
Avec Swift 3, j'obtiens une erreur sur la troisième ligne, "Type 'String' n'est pas conforme au protocole 'indexable'".
RenniePet
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
zaph
la source
0

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"]
Steve Rosenberg
la source
C'est OK, mais c'est déroutant.
DawnSong
Je m'attendais à ce qu'il imprime "est"
Yitzchak
0

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"]
pacification
la source
0

Un autre moyen pratique de convertir un ArraySliceen Arrayest 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.

Jeremyabannister
la source
0

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])
StarPlayrX
la source