web-dev-qa-db-fra.com

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

Je coupe un tableau de chaînes et le configure en une variable [String], mais le vérificateur de type se plaint. Est-ce un bug possible du compilateur?

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

 screenshot

79
Liron Shapira

La souscription 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)
156
Connor
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
14
zaph

Un autre moyen pratique de convertir une ArraySlice en Array est la suivante:

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 l'examinera plus tard risque de 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 du compilateur, ce qui, espérons-le, en clarifiera le but.

0
jeremyabannister

Vous pouvez également faire cela 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"]
0
Steve Rosenberg

Une autre façon de faire cela à un endroit est de combiner la déclaration de variable let someTags: [String] et map(_:) , qui transformera ArraySlice<String> en [String]:

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
0
pacification