In Swift, il tipo restituito di slicing Array [String] non sembra essere [String]


87

Sto affettando un array di stringhe e impostandolo su una [String]variabile, ma il controllo del tipo si lamenta. È un possibile bug del compilatore?

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

immagine dello schermo

Risposte:


169

La sottoscrizione di un array con un intervallo non restituisce un array, ma una sezione. Tuttavia, puoi creare un array da quella slice.

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)

3
Dove trovi Slicedocumentato? Inoltre, il messaggio di errore non è corretto e viene Slicevisualizzato come [String] nel playground. Quindi sembra che ci siano due errori del compilatore e documentazione mancante.
Zaph

1
Puoi vedere la definizione del metodo di iscrizione qui: developer.apple.com/library/prerelease/ios/documentation/…
Connor

2
Sono d'accordo che l'errore non è corretto e la documentazione potrebbe richiedere del lavoro. Se lo provi in ​​due passaggi: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsti dà il più utileerror: 'Slice<String>' is not convertible to '[String]'
Connor

Colpa mia, ho guardato gli iBooks Swift. Penso che Apple dovrebbe rimuoverli o mantenerli aggiornati.
Zaph

1
Con Swift 3 ricevo un errore sulla terza riga, "Il tipo 'String' non è conforme al protocollo 'indicizzabile'".
RenniePet

14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"

0

Puoi anche farlo per ottenere un nuovo array della fetta:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]

Va bene, ma crea confusione.
DawnSong

Mi aspettavo che stampasse "è"
Yitzchak

0

Un altro modo per farlo in un posto è combinare la dichiarazione delle variabili let someTags: [String]e map(_:), che si trasformerà ArraySlice<String>in [String]:

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

0

Un altro modo conveniente per convertire un ArraySlicein Arrayè questo:

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

Non è perfetto perché un altro sviluppatore (o te stesso) che lo guarda in seguito potrebbe non capirne lo scopo. La buona notizia è che se lo sviluppatore (forse tu) rimuove il + [], verrà immediatamente riscontrato un errore del compilatore, che si spera chiarirà il suo scopo.


0

Basta lanciare la fetta come un array quando viene creata. Mantenere il tuo array come un array senza dover usare una variabile intermedia. Funziona alla grande quando si utilizzano i tipi Codable.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.