Преобразование срезов обратно в массивы
Создавайте из среза отдельный массив.
«Преобразование срезов обратно в массивы» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Срезы — не массивы
ArraySlice — отдельный тип, отличный от Array. Многие программные интерфейсы ожидают именно конкретный тип Array, поэтому часто требуется преобразование.
let original = [1, 2, 3, 4, 5]
let slice = original[1..<4]
print(type(of: slice))Преобразование среза в массив
Оберните срез в инициализатор Array(...), чтобы создать новый независимый массив со скопированными элементами и индексами, начинающимися с нуля.
let original = [10, 20, 30, 40, 50]
let slice = original[2..<5]
let array = Array(slice)
print(array)
print(type(of: array))Индексы снова начинаются с нуля
После преобразования новый массив начинает индексацию с 0, в отличие от среза, который сохраняет индексы родительского массива.
let original = [1, 2, 3, 4, 5]
let slice = original[3..<5]
let copy = Array(slice)
print("slice start:", slice.startIndex)
print("array start:", copy.startIndex)Преобразование копирует хранилище
Преобразование принудительно создаёт копию. Новый массив больше не использует общее хранилище с родительским, поэтому его изменение не влияет на исходный массив.
let original = [1, 2, 3, 4]
var copy = Array(original[1..<3])
copy[0] = 999
print("original:", original)
print("copy:", copy)Возврат массивов из функций
Если функция возвращает часть массива, преобразуйте срез, чтобы вызывающий код получил обычный Array.
func firstThree(of nums: [Int]) -> [Int] {
return Array(nums.prefix(3))
}
print(firstThree(of: [9, 8, 7, 6, 5]))Передача параметрам типа Array
Если параметр программного интерфейса имеет тип [Int], перед передачей ему необходимо преобразовать срез.
func total(_ values: [Int]) -> Int {
return values.reduce(0, +)
}
let data = [1, 2, 3, 4, 5]
let result = total(Array(data[1..<4]))
print(result)Когда преобразование не требуется
Если Ваша функция принимает обобщённый Sequence или Collection, Вы можете передать срез напрямую, не выполняя преобразование.
func describe<S: Sequence>(_ s: S) where S.Element == Int {
print(Array(s))
}
let arr = [2, 4, 6, 8]
describe(arr[1..<3])Компромисс между памятью и производительностью
Срезы не создают копии и сохраняют хранилище исходного массива. Если Вы долго храните небольшой срез огромного массива, преобразуйте его в массив, чтобы освободить большой буфер.
let huge = Array(1...1000)
let keep = Array(huge[0..<3]) // small independent copy
print(keep)Преобразование в Set
Вы также можете передать срез другим инициализаторам коллекций, например Set.
let arr = [1, 2, 2, 3, 3, 3]
let uniqueTail = Set(arr[2..<6])
print(uniqueTail.sorted())Циклическое преобразование
Сначала получить срез, затем преобразовать его и снова получить срез — совершенно нормально. Каждое преобразование явно и предсказуемо.
let arr = [10, 20, 30, 40, 50]
let a = Array(arr[1..<4])
let b = Array(a[0..<2])
print(a)
print(b)Рекомендация
Работайте со срезами во время вычислений, а в Array преобразуйте их только на границе, где Вы сохраняете или возвращаете результат.
let arr = [3, 1, 4, 1, 5, 9, 2]
let top3 = Array(arr.sorted(by: >)[0..<3])
print(top3)Быстрая проверка
Проверьте преобразование среза.
Итоги
Используйте Array(slice), чтобы превратить ArraySlice в независимый массив с индексами, начинающимися с нуля, и собственным хранилищем копии. Выполняйте преобразование на границах API, а во время вычислений сохраняйте срезы, чтобы избежать лишних копий.
let s = [1, 2, 3, 4, 5][2..<5]
let a = Array(s)
print(a, a.startIndex)Часто задаваемые вопросы
Урок «Преобразование срезов обратно в массивы» бесплатный?
Да — полный текст урока «Преобразование срезов обратно в массивы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Преобразование срезов обратно в массивы»?
Создавайте из среза отдельный массив. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Преобразование срезов обратно в массивы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание срезов с помощью диапазонов
- Семантика индексов ArraySlice
- Преобразование срезов обратно в массивы
- prefix, suffix и dropFirst