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

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)

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]"

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"]

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"]

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.


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])
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.