Di Swift, jenis pengembalian pemotongan Array [String] tampaknya bukan [String]

87

Saya mengiris array string dan mengaturnya ke [String]variabel, tetapi pemeriksa tipe mengeluh. Apakah ini mungkin bug kompiler?

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

tangkapan layar

Liron Shapira
sumber

Jawaban:

169

Subscripting array dengan range tidak mengembalikan array, tapi slice. Anda dapat membuat array dari potongan itu.

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
Connor
sumber
3
Di mana Anda menemukan yang Sliceterdokumentasi? Juga pesan kesalahan salah dan Slicemuncul sebagai [String] di taman bermain. Dengan demikian, tampaknya ada dua kesalahan kompiler dan dokumentasi yang hilang.
zaf
1
Anda dapat melihat definisi metode subscipt di sini: developer.apple.com/library/prerelease/ios/documentation/…
Connor
2
Saya setuju bahwa kesalahan tersebut tidak benar dan dokumentasi mungkin memerlukan beberapa perbaikan. Jika Anda mencobanya dalam dua langkah: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsini memberi Anda lebih bermanfaaterror: 'Slice<String>' is not convertible to '[String]'
Connor
Salah saya, saya melihat iBooks Swift. Saya pikir Apple harus menghapusnya agar tetap up-to-date.
zaf
1
Dengan Swift 3 saya mendapatkan pesan kesalahan pada baris ketiga, "Ketik 'String' tidak sesuai dengan protokol 'dapat diindeks'".
RenniePet
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
zaph
sumber
0

Anda juga bisa melakukan ini untuk mendapatkan array baru dari slice:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]
Steve Rosenberg
sumber
Tidak apa-apa, tapi membingungkan.
DawnSong
Saya berharap itu akan mencetak "adalah"
Yitzchak
0

Cara lain untuk melakukannya di satu tempat adalah menggabungkan deklarasi variabel let someTags: [String]dan map(_:), itu akan berubah ArraySlice<String>menjadi [String]:

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

Cara lain yang mudah untuk mengkonversi ArraySliceke Arrayadalah ini:

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

Itu tidak sempurna karena pengembang lain (atau Anda sendiri) yang melihatnya nanti mungkin tidak memahami tujuannya. Kabar baiknya adalah jika pengembang itu (mungkin Anda) menghapusnya, + []mereka akan segera menemui kesalahan kompiler, yang diharapkan akan menjelaskan tujuannya.

jeremyabannister
sumber
0

Cukup cast potongan sebagai Array saat dibuat. Menjaga Array Anda sebagai array tanpa harus menggunakan variabel perantara. Ini berfungsi dengan baik saat menggunakan jenis Codable.

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