0Pricing
Swift Academy · Урок

Преобразование срезов обратно в массивы

Создавайте из среза отдельный массив.

«Преобразование срезов обратно в массивы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание срезов с помощью диапазонов
  2. Семантика индексов ArraySlice
  3. Преобразование срезов обратно в массивы
  4. prefix, suffix и dropFirst
← Назад к Swift Academy