en
Feedback
Swift | Вопросы собесов

Swift | Вопросы собесов

Open in Telegram
2 213
Subscribers
No data24 hours
-27 days
-830 days
Posts Archive
🤔 Какие виды ссылок бывают в Swift? – strong — по умолчанию, удерживает объект в памяти. – weak — не увеличивает счётчик ссылок и становится nil, когда объект освобождён. – unowned — не увеличивает счётчик, но не обнуляется (используется, когда объект точно не должен быть уничтожен до использования). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 С какими типами можно использовать ссылки? Ссылки (strong, weak, unowned) применимы только к reference-типа — то есть к экземплярам классов. Value-типы (например, struct, enum) копируются при передаче, и на них нельзя создать ссылку в обычном понимании. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Есть ли функция первого класса в языке? Да. В Swift функции — объекты первого класса. Их можно передавать как параметры, возвращать из других функций и сохранять в переменные. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 За что отвечают Compression Resistance Priority? Отвечают за сопротивление сжатию UI-элемента в ограниченном пространстве. Элемент с более высоким приоритетом будет меньше сжиматься, чем элемент с более низким значением. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как приложения реагируют на нажатия? Система распознаёт событие касания, передаёт его объекту UIResponder, который находится в иерархии view. Объект может обработать его или передать дальше по цепочке. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как инициализация классов связана с выделением памяти? При инициализации класса происходит выделение памяти в heap, а затем инициализация всех его свойств. После завершения инициализации объект готов к использованию. Это отличается от структур, которые хранятся в stack (если не вложены в ссылочный тип). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что нужно сделать, чтобы вызвать жизненный цикл view-контроллера? Жизненный цикл UIViewController запускается: - При инициализации и отображении контроллера (вручную или через навигацию). - Основные методы: - viewDidLoad() - viewWillAppear() - viewDidAppear() - viewWillDisappear() - viewDidDisappear() Чтобы вызвать жизненный цикл вручную: - Представить контроллер: - Или встроить в навигацию: Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Если обозначить внутри метода Synchronized , что будет монитору? Это высокоуровневый механизм синхронизации, который объединяет взаимное исключение (mutex) и условные переменные (condition variables) для управления доступом к объектам в многопоточной среде. 🚩Как работает 🟠Взаимное исключение (Mutual Exclusion) Только один поток может выполнить защищенный блок кода в любой момент времени. 🟠Условные переменные (Condition Variables) Позволяют потокам ожидать определенных условий, а другим потокам уведомлять их о наступлении этих условий. 🚩Примеры
class ThreadSafeClass {
    private var internalState = 0
    private let queue = DispatchQueue(label: "com.example.threadSafeQueue")
    
    func increment() {
        queue.sync {
            internalState += 1
        }
    }
    
    func getState() -> Int {
        return queue.sync {
            internalState
        }
    }
}
С NSLock
class ThreadSafeClass {
    private var internalState = 0
    private let lock = NSLock()
    
    func increment() {
        lock.lock()
        internalState += 1
        lock.unlock()
    }
    
    func getState() -> Int {
        lock.lock()
        let state = internalState
        lock.unlock()
        return state
    }
}
С objc_sync_enter и objc_sync_exit
class ThreadSafeClass: NSObject {
    private var internalState = 0
    
    func increment() {
        objc_sync_enter(self)
        internalState += 1
        objc_sync_exit(self)
    }
    
    func getState() -> Int {
        objc_sync_enter(self)
        let state = internalState
        objc_sync_exit(self)
        return state
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 В каком методе жизненного цикла контроллера нам в первый раз известны финальные размеры view? Финальные размеры UIView гарантированно известны в методе viewDidLayoutSubviews(). На этом этапе система уже рассчитала Auto Layout и определила финальный frame всех вью. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Есть функция, принимающая аргумент, а туда закинут integer — что произойдёт? В языках со строгой типизацией (Swift, Kotlin, Java) произойдёт ошибка компиляции, если типы не совпадают. В динамически типизированных языках (Python, JavaScript) может быть попытка приведения типа — и тогда поведение зависит от реализации функции. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое многопоточность? Это возможность центрального процессора (ЦПУ) или программы выполнять несколько задач (потоков) одновременно. В контексте программирования она используется для улучшения производительности приложений за счёт параллельной обработки задач. Это особенно важно для задач, требующих интенсивных вычислений, или приложений, которые должны одновременно реагировать на множество входных данных, таких как пользовательский интерфейс. 🚩Основные понятия 🟠Поток (Thread) Минимальная единица обработки, которая может быть выполнена операционной системой. 🟠Конкуренция (Concurrency) Способность программы делать прогресс в нескольких задачах одновременно. Конкуренция достигается за счёт переключения между задачами. 🟠Параллелизм (Parallelism) Способность программы выполнять несколько операций одновременно, используя множество процессоров или ядер. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как отменять синхронные задачи? Синхронные задачи нельзя отменить напрямую — нужно использовать флаг (например, isCancelled) и вручную проверять его внутри выполнения. Лучше использовать DispatchWorkItem или Operation. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как устроена память? Память устройства можно представить в виде нескольких уровней, каждый из которых имеет свою скорость доступа, размер и назначение: 🟠Регистры процессора Это самая быстрая память, непосредственно встроенная в процессор. Регистры хранят те данные, с которыми процессор работает в данный момент времени. 🟠Кэш-память Она находится непосредственно на процессоре или рядом с ним. Кэш-память используется для временного хранения копий часто используемых данных из основной памяти для ускорения доступа к ним. Кэш-память делится на несколько уровней (L1, L2, и иногда L3), где L1 — самый быстрый и обычно самый маленький. 🟠Оперативная память (ОЗУ) Здесь хранятся данные и программы, с которыми компьютер работает в данный момент. Доступ к ОЗУ быстрый, но оно является временным хранилищем: при выключении устройства данные в ОЗУ теряются. 🟠Постоянная память (ПЗУ, SSD, HDD) Это память для долговременного хранения данных. Она сохраняет информацию даже при выключении питания. HDD (жесткие диски) использовались ранее и работают на принципе магнитного записывания данных, в то время как SSD (твердотельные накопители) работают на основе флеш-памяти и обеспечивают более быстрый доступ к данным. 🟠Виртуальная память Это техника, которая позволяет операционной системе использовать часть жесткого диска (или SSD) как дополнительную оперативную память. Когда ОЗУ заполнено, операционная система может перемещать редко используемые данные из ОЗУ на диск в специальный файл подкачки (swap file), освобождая ОЗУ для других задач. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как функционируют стеки между собой? Стеки между собой не взаимодействуют напрямую, потому что каждый из них принадлежит отдельному потоку и находится в своей изолированной памяти. Однако потоки могут обмениваться данными через: - Общую (разделяемую) память. - Коллекции или переменные, защищённые механизмами синхронизации (например, DispatchQueue, NSLock, Atomic). - Очереди (например, GCD или OperationQueue в Swift). Сами стеки — независимы и не пересекаются между потоками. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про две семантики в swift'е В Swift все типы данных делятся на два вида по семантике хранения и передачи: 🚩Значимая семантика (Value Semantics) Структуры (struct), перечисления (enum) и кортежи (tuple) передаются по значению, то есть каждое присваивание создаёт копию объекта.
struct User {
    var name: String
}

var user1 = User(name: "Alice")
var user2 = user1  // Копия!

user2.name = "Bob"

print(user1.name) // "Alice" (НЕ изменилось)
print(user2.name) // "Bob"
🚩Ссылочная семантика (Reference Semantics) Классы (class), акторы (actor) и замыкания (closure) передаются по ссылке, то есть несколько переменных могут ссылаться на один и тот же объект.
class User {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var user1 = User(name: "Alice")
var user2 = user1  // Передача ссылки!

user2.name = "Bob"

print(user1.name) // "Bob" (ИЗМЕНИЛОСЬ!)
print(user2.name) // "Bob"
Ставь 👍 и забирай 📚 Базу знаний

Главный навык на ближайшие годы — ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запуска
Главный навык на ближайшие годы — ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную. Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы. Подписывайтесь, нас уже 30 тысяч: @vibecoding_tg

🤔 Как отлавливать, где допущена ошибка в свифте? В Swift есть несколько способов отлавливать и диагностировать ошибки в коде: 🚩Обработка ошибок через `do-catch` Используется, если функция генерирует ошибку (throws).
enum LoginError: Error {
    case wrongPassword
    case userNotFound
}

func login(user: String, password: String) throws {
    if user != "admin" { throw LoginError.userNotFound }
    if password != "1234" { throw LoginError.wrongPassword }
}

do {
    try login(user: "admin", password: "wrong")
} catch LoginError.wrongPassword {
    print("Ошибка: Неверный пароль")
} catch {
    print("Ошибка: \(error)")
}
🚩`assert()`, `precondition()`, `fatalError()` (для отладки) Эти функции прерывают выполнение программы, если что-то пошло не так. assert() (только в Debug)
let age = -5
assert(age >= 0, "Возраст не может быть отрицательным")
precondition() (работает в Release)
precondition(age >= 0, "Возраст не может быть отрицательным")
fatalError() (прерывает программу)
func getData() -> String {
    fatalError("Метод ещё не реализован")
}
Ставь 👍 и забирай 📚 Базу знаний

🤔Что такое cherrypick? cherrypick — это команда Git, которая позволяет взять конкретные изменения из одного коммита и применить их в другой ветке. Это полезно для исправления ошибок или добавления небольших фич без полного слияния веток. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Перечислите все ленивые (lazy) контейнеры/вью? В iOS существует несколько ленивых (lazy) контейнеров и вью, которые откладывают создание или загрузку элементов до момента их фактического использования. 🚩`lazy var` (ленивые свойства) Обычное свойство инициализируется сразу, а lazy – только при первом вызове.
class Example {
    lazy var expensiveObject: Data = {
        print("Объект создан!")
        return Data()
    }()
}

let obj = Example()
print("Объект ещё не создан")
_ = obj.expensiveObject // Только теперь создастся
🚩`LazySequence` и `LazyCollection` Если вы хотите избежать лишних вычислений, можно использовать ленивую последовательность:
let numbers = (1...1000).lazy.map { $0 * 2 } // Не вычисляется сразу!
print(numbers.first!) // Только теперь вычисляется первый элемент
🚩`LazyVStack`, `LazyHStack`, `LazyGrid` (SwiftUI) В отличие от обычных VStack и HStack, ленивые версии создают элементы только при прокрутке.
ScrollView {
    LazyVStack {
        ForEach(0..<1000) { index in
            Text("Элемент \(index)")
        }
    }
}
🚩`UITableView` и `UICollectionView` (UIKit) Они работают по принципу переиспользования ячеек, загружая их только когда нужно.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = "Строка \(indexPath.row)"
    return cell
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как устроены массивы? В Swift массив — это структура с механизмом Copy-on-Write. Под капотом — буфер в памяти, индексируемый по целому числу. Массивы автоматически расширяются при добавлении новых элементов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний