En Swift, el tipo de retorno de corte de Array [String] no parece ser [String]

87

Estoy cortando una matriz de cadenas y estableciendo eso en una [String]variable, pero el verificador de tipos se queja. ¿Es un posible error del compilador?

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

captura de pantalla

Liron Shapira
fuente

Respuestas:

169

El subíndice de una matriz con un rango no devuelve una matriz, sino un segmento. Sin embargo, puede crear una matriz a partir de ese segmento.

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
Connor
fuente
3
¿Dónde encuentras Slicedocumentado? Además, el mensaje de error es incorrecto y Sliceaparece como [String] en el patio de recreo. Por tanto, parece que hay dos errores del compilador y falta documentación.
zaph
1
Puede ver la definición del método subscipt aquí: developer.apple.com/library/prerelease/ios/documentation/…
Connor
2
Estoy de acuerdo en que el error es incorrecto y que la documentación podría necesitar algo de trabajo. Si lo prueba en dos pasos: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsle da más ayudaerror: 'Slice<String>' is not convertible to '[String]'
Connor
Mi culpa, miré los iBooks Swift. Creo que Apple debería eliminarlos o mantenerlos actualizados.
zaph
1
Con Swift 3, aparece un error en la tercera línea, "Tipo 'Cadena' no se ajusta al protocolo 'indexable'".
RenniePet
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
zaph
fuente
0

También puede hacer esto para obtener una nueva matriz del segmento:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]
Steve Rosenberg
fuente
Está bien, pero es confuso.
DawnSong
Esperaba que imprimiera "es"
Itzjak
0

Otra forma de hacerlo en un solo lugar es combinar la declaración de variable let someTags: [String]y map(_:)eso se transformará ArraySlice<String>en [String]:

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

Otra forma conveniente de convertir un ArraySlicea Arrayes esta:

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

No es perfecto porque es posible que otro desarrollador (o usted mismo) que lo vea más adelante no entienda su propósito. La buena noticia es que si ese desarrollador (tal vez usted) elimina el, + []se encontrará inmediatamente con un error del compilador, que con suerte aclarará su propósito.

jeremyabannister
fuente
0

Simplemente transmita el segmento como una matriz cuando se cree. Mantener su matriz como una matriz sin tener que usar una variable intermedia. Esto funciona muy bien cuando se utilizan tipos codificables.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
StarPlayrX
fuente