Я нарізаю масив рядків і встановлюю його [String]
змінною, але перевірка типу скаржиться. Чи можлива помилка компілятора?
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]
Відповіді:
Підписка на масив з діапазоном не повертає масив, а зріз. Ви можете створити масив із цього фрагмента.
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
var someTags = tags[1..<3] var someTagsArray: [String] = someTags
це дасть вам більше користіerror: 'Slice<String>' is not convertible to '[String]'
Інший спосіб зробити це в одному місці - поєднати оголошення змінної let someTags: [String]
та map(_:)
, яке перетвориться ArraySlice<String>
на [String]
:
let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
Інший зручний спосіб конвертувати ArraySlice
в Array
це такий:
var tags = ["this", "is", "cool"]
var someTags: [String] = tags[1..<3] + []
Це не ідеально, оскільки інший розробник (або ви самі), який розглядає його пізніше, може не зрозуміти його мети. Хороша новина полягає в тому, що якщо цей розробник (можливо, ви) видаляє їх, + []
вони негайно зустрінуться з помилкою компілятора, яка, сподіваємось, пояснить його мету.
Просто додайте фрагмент як масив, коли він створений. Зберігання масиву як масиву без використання проміжної змінної. Це чудово працює при використанні типів Codable.
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Slice
задокументоване? Також повідомлення про помилку є неправильним, іSlice
на ігровому майданчику відображається як [Рядок]. Таким чином, здається, що є дві помилки компілятора та відсутні документи.