Em Swift, o tipo de retorno de fatiamento Array [String] não parece ser [String]


87

Estou fatiando uma série de strings e definindo isso como uma [String]variável, mas o verificador de tipo está reclamando. É um possível bug do compilador?

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

captura de tela

Respostas:


169

Inscrever uma matriz com um intervalo não retorna uma matriz, mas uma fatia. Você pode criar uma matriz a partir dessa fatia.

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

3
Onde você encontra Slicedocumentado? Além disso, a mensagem de erro está incorreta e Sliceaparece como [String] no playground. Portanto, parece que há dois erros do compilador e documentação ausente.
zaph

1
Você pode ver a definição do método de subscrição aqui: developer.apple.com/library/prerelease/ios/documentation/…
Connor

2
Eu concordo que o erro está incorreto e a documentação precisa de algum trabalho. Se você tentar em duas etapas: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsserá mais útilerror: 'Slice<String>' is not convertible to '[String]'
Connor

Culpa minha, olhei para o iBooks Swift. Acho que a Apple deveria removê-los para mantê-los atualizados.
zaph

1
Com o Swift 3, estou obtendo um erro na terceira linha, "Digite 'String' não está em conformidade com o protocolo 'indexável'".
RenniePet

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

0

Você também pode fazer isso para obter uma nova matriz da fatia:

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

Tudo bem, mas é confuso.
DawnSong

Eu esperava que fosse imprimir "é"
Yitzchak

0

Outra maneira de fazer isso em um lugar é combinar a declaração de variável let someTags: [String]e map(_:), isso se transformará ArraySlice<String>em [String]:

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

0

Outra maneira conveniente de converter um ArraySlicepara Arrayé esta:

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

Não é perfeito porque outro desenvolvedor (ou você) que olhar para ele mais tarde pode não entender sua finalidade. A boa notícia é que, se esse desenvolvedor (talvez você) remover o, + []ele será imediatamente encontrado com um erro do compilador, o que esperamos esclarecer seu propósito.


0

Basta lançar a fatia como um Array quando for criada. Manter seu Array como um array sem ter que usar uma variável intermediária. Isso funciona muito bem ao usar tipos codificáveis.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.