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

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)

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

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

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

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.


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])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.