У Swift тип повернення масиву [String], здається, не є [String]


87

Я нарізаю масив рядків і встановлюю його [String]змінною, але перевірка типу скаржиться. Чи можлива помилка компілятора?

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

скріншот

Відповіді:


169

Підписка на масив з діапазоном не повертає масив, а зріз. Ви можете створити масив із цього фрагмента.

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

3
Де ви знаходите Sliceзадокументоване? Також повідомлення про помилку є неправильним, і Sliceна ігровому майданчику відображається як [Рядок]. Таким чином, здається, що є дві помилки компілятора та відсутні документи.
зап

1
Ви можете побачити визначення методу subscipt тут: developer.apple.com/library/prerelease/ios/documentation/…
Connor

2
Я погоджуюсь, що помилка неправильна, і документація може використати певну роботу. Якщо ви спробуєте це у два етапи: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsце дасть вам більше користіerror: 'Slice<String>' is not convertible to '[String]'
Коннор,

Я винен, я подивився на Swift iBooks. Я думаю, що Apple повинна видалити їх, щоб постійно їх оновлювати.
zaph

1
З Swift 3 я отримую помилку в третьому рядку, "Тип" Рядок "не відповідає протоколу" індексується "".
RenniePet

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

0

Ви також можете зробити це, щоб отримати новий масив зрізу:

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

Це нормально, але це бентежить.
DawnSong

Я очікував, що це надрукує "є"
Іцчак

0

Інший спосіб зробити це в одному місці - поєднати оголошення змінної let someTags: [String]та map(_:), яке перетвориться ArraySlice<String>на [String]:

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

0

Інший зручний спосіб конвертувати ArraySliceв Arrayце такий:

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

Це не ідеально, оскільки інший розробник (або ви самі), який розглядає його пізніше, може не зрозуміти його мети. Хороша новина полягає в тому, що якщо цей розробник (можливо, ви) видаляє їх, + []вони негайно зустрінуться з помилкою компілятора, яка, сподіваємось, пояснить його мету.


0

Просто додайте фрагмент як масив, коли він створений. Зберігання масиву як масиву без використання проміжної змінної. Це чудово працює при використанні типів Codable.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.