Я был на собеседовании по iOS. Всё шло хорошо — я ответил на вопрос об optional, рассказал об ARC и даже решил небольшую задачу с замыканиями.
Затем интервьюер откинулся назад и спросил:
Предположим, вам нужно загрузить 10,000 элементов в Swift. Что бы вы использовали: Array или Set?
Сначала я совсем растерялся. Массивы? Я использую их каждый день. Списки пользователей, модели продуктов, ответы API и источники данных табличных представлений — они повсюду в iOS.
Множества? Честно говоря, я использовал их только тогда, когда мне нужны были уникальные идентификаторы или когда я копировал что-то прямо со Stack Overflow.
Но вот в чём дело: это был вопрос не о синтаксисе. Вопрос был о том, как я думаю.
Почему интервьюеры это спрашивают
Это похоже на базовый вопрос о структурах данных, но это не так.
На самом деле, речь идёт о следующем:
- Знаете ли вы, как ведут себя массивы и множества в Swift?
- Можете ли вы объяснить разницу простым языком?
- Думаете ли вы о компромиссах, а не о единственном «правильном» ответе?
- Связываете ли вы это с реальной работой приложения в iOS?
Вот почему этот вопрос так популярен на собеседованиях. Он отличает людей, которые запоминают, от тех, кто умеет рассуждать.
Шаг 1: Не спешите с ответом
Вместо того, чтобы выпалить: «С множествами быстрее», я задал уточняющий вопрос:
«Что нам важнее — вставка, поиск или просто цикл по элементам?»
Интервьюер улыбнулся и сказал: «Хороший вопрос. Допустим, нас интересуют поиск».
Это дало мне нужную подсказку.
Шаг 2: Массивы в Swift
Массивы — это как любимая еда в Swift. Они просты, они повсюду, и вы уже знаете, как ими пользоваться.
Ключевые моменты:
- Элементы сохраняются в том же порядке, в котором вы их добавляете
- Доступ по индексу осуществляется за время
O(1) - Могут быть дубликаты
- Но проверка наличия элемента (
.contains) выполняется заO(n)— Swift может сканировать весь массив
Пример:
var numbers: [Int] = []
for i in 0..<10000 {
numbers.append(i)
}
let exists = numbers.contains(5000) // O(n)
print("Contains 5000? \(exists)")
Массивы отлично подходят, когда:
- Вам важен порядок
- Вам нужны дубликаты
- Всё равно вы в основном перебираете всё в цикле
Шаг 3: Множества в Swift
Множества кажутся менее привычными, но на самом деле они очень мощные.
Ключевые моменты:
- Они хранят только уникальные элементы
- Им не важен порядок
- Вставка и поиск в среднем выполняются за
O(1)из-за хеширования
Пример:
var numbers: Set<Int> = []
for i in 0..<10000 {
numbers.insert(i)
}
let exists = numbers.contains(5000) // O(1) average
print("Contains 5000? \(exists)")
Наборы отлично подходят, когда:
- Вам нужны быстрые проверки наличия элемента
- Вам нужна уникальность
- Вам не важен порядок
Шаг 4: Бенчмарки в Swift
Я решил показать интервьюеру, как я буду это тестировать. Вот быстрый тест на Swift:
import Foundation
let array = Array(0..<10000)
let set = Set(0..<10000)
// Array lookup
var start = CFAbsoluteTimeGetCurrent()
for _ in 0..<10000 {
_ = array.contains(9999)
}
var diff = CFAbsoluteTimeGetCurrent() - start
print("Array lookup: \(diff) seconds")
// Set lookup
start = CFAbsoluteTimeGetCurrent()
for _ in 0..<10000 {
_ = set.contains(9999)
}
diff = CFAbsoluteTimeGetCurrent() - start
print("Set lookup: \(diff) seconds")
Что тут происходит:
- Поиск по массиву → медленнее (линейное сканирование)
- Поиск по множеству → намного быстрее (поиск по хешу)
Примерно для 10,000 элементов оба варианта всё ещё быстры. Но если увеличить до 1 миллиона, множества полностью разгромят массивы.
Шаг 5: Реальные примеры для iOS
Вот где вы набираете очки на собеседованиях: свяжите теорию с разработкой для iOS.
Где я бы использовал массив в iOS:
- Источник данных UITableView или UICollectionView
- Сообщения чата (порядок важен, дубликаты разрешены)
- Отображение списка из 10 000 товаров
Где я бы использовал набор:
- Хранение уникальных идентификаторов пользователей
- Проверка наличия товара в избранном
- Удаление дубликатов из результатов API
Это сделает ваш ответ реалистичным, а не просто теоретическим.
Шаг 6: Мой окончательный ответ
Вот как я это подытожил:
«Если мне нужен быстрый поиск и уникальность, я бы использовал Set — .contains — это O(1). Если мне нужен порядок или дубликаты, то я бы использовал Array. Для итерации по всем 10,000 элементов Array может быть даже немного быстрее, поскольку он меньше занимает памяти. Для 10,000 оба варианта работают нормально, но я бы подумал о масштабируемости по мере роста данных».
Интервьюер кивнул. Это был сигнал, что я на правильном пути.
Шаг 7: Ловушка повторения
Он не закончил. Он спросил:
«Но 10 000 — это не так уж много. Разве это имеет значение?»
В этом и был весь трюк.
Я мог бы сказать: «Нет, это неважно», но это звучит лениво.
Вместо этого я сказал:
«Вы правы — для 10 тысяч элементов оба варианта хороши. Но я бы всё равно выбрал, исходя из будущих потребностей. Если массив вырастет до 10 миллионов, поиск по массиву станет очень медленным, но набор по-прежнему будет работать хорошо. Так что дело не только в сегодняшнем объёме».
Вот это и был настоящий успех.
Выводы
Для разработчиков на Swift вот краткое резюме:
- Используйте Array → если вам нужен порядок, дубликаты или просто нужно перебирать всё
- Используйте Set → если вам нужна уникальность и очень быстрый поиск
- Для 10 тысяч элементов → оба варианта хороши, но набор безопаснее, если объём данных может расти
Заключение
Это интервью меня кое-чему научило. На самом деле, речь идёт не о том, что лучше: Array или Set. Главное — показать, что вы умеете рассуждать, объяснять компромиссы и применять это на практике.
В следующий раз, когда услышите этот вопрос, не паникуйте. Просто объясните ход своих мыслей, при необходимости напишите небольшой пример и свяжите его с реальной разработкой для iOS.
Вот так простой вопрос о структуре данных превращается в ключевой ответ для трудоустройства.
Другие вопросы с собеседований

