и посмотреть медиа
Swift | Interview Questions
и посмотреть медиа
Swift interview questions, tests and tasks for iOS developers in Telegram.
Swift interview questions, tests and tasks for iOS developers in Telegram.
AI bot for text-to-speech and voice cloning in Telegram. Create audio using neural network quickly and easily.
The channel is dedicated to preparing for Swift language interviews. It contains current questions, tests, practical tasks and vacancy information. Ideal for beginner and experienced iOS developers who want to refresh their knowledge and successfully pass interviews.
🤔 Что из себя представляет структура данных stack? Stack (стек) – это структура данных, работающая по принципу LIFO (Last In, First Out – "последним пришел, первым ушел"). 🚩Пример реализации стека в Swift В Swift нет встроенного стека (кроме Array), но можно создать свой: struct Stack { private var elements: [T] = [] mutating func push(_ item: T) { elements.append(item) } mutating func pop() -> T? { return elements.popLast() // Удаляет и возвращает верхний элемент } func peek() -> T? { return elements.last // Возвращает верхний элемент без удаления } func isEmpty() -> Bool { return elements.isEmpty } } // Пример использования: var stack = Stack() stack.push(10) stack.push(20) stack.push(30) print(stack.pop()!) // 30 print(stack.peek()!) // 20 print(stack.isEmpty()) // false 🚩Где используется стек? Обратный порядок выполнения (рекурсия) – стек вызовов функций. Алгоритмы (обратная польская нотация, DFS – поиск в глубину) История действий (назад-вперед в браузере, отмена в редакторе). Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как увеличить область нажатия на кнопку? Чтобы увеличить зону клика UIButton: 1. Создать кастомную кнопку и переопределить point(inside:with:) 2. Либо обернуть кнопку в UIView с большим frame, но маленькой кнопкой внутри. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие изменения надо сделать в constrait перед вызовом layout? Перед вызовом layoutIfNeeded() или layoutSubviews() в iOS-приложении, нужно изменить значение констрейнта и вызвать анимацию, если необходимо. Вот основные шаги: 🟠Обновление значения констрейнта Перед вызовом layoutIfNeeded(), измените свойство констрейнта (например, constant у NSLayoutConstraint). class ViewController: UIViewController { @IBOutlet weak var button: UIButton! @IBOutlet weak var heightConstraint: NSLayoutConstraint! override func viewDidLoad() { super.viewDidLoad() DispatchQueue.main.asyncAfter(deadline: .now() + 2) { self.changeButtonHeight() } } func changeButtonHeight() { heightConstraint.constant = 100 // Меняем значение констрейнта UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() // Перестраиваем макет } } } 🟠Если меняется набор констрейнтов Если нужно удалить/добавить констрейнты, используйте `activate()` / `deactivate()`. var expanded = false @IBOutlet weak var smallHeightConstraint: NSLayoutConstraint! @IBOutlet weak var largeHeightConstraint: NSLayoutConstraint! func toggleHeight() { expanded.toggle() if expanded { NSLayoutConstraint.deactivate([smallHeightConstraint]) NSLayoutConstraint.activate([largeHeightConstraint]) } else { NSLayoutConstraint.deactivate([largeHeightConstraint]) NSLayoutConstraint.activate([smallHeightConstraint]) } UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } 🟠Если работа идёт в `viewDidLoad()` Во viewDidLoad() элементы ещё не отрисованы, поэтому layoutIfNeeded() не сработает. Используйте viewDidAppear() или вызовите layoutIfNeeded() после view.layoutIfNeeded(). override func viewDidLoad() { super.viewDidLoad() heightConstraint.constant = 100 view.layoutIfNeeded() // НЕ обновит макет, потому что он ещё не загружен } Решение override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) heightConstraint.constant = 100 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } Разница между layoutIfNeeded() и setNeedsLayout() heightConstraint.constant = 100 view.setNeedsLayout() // Обновление произойдет на следующем цикле рендера Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как поменять иконку приложения в зависимости от среды? Для этого используют App Icon Sets, и в Info.plist можно указать набор иконок в зависимости от build-конфигурации. В Xcode можно также использовать xcconfig или Build Scheme, чтобы переключать иконки по окружению. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие есть инструменты для работы с потоками? В Swift есть несколько инструментов для работы с многопоточностью и параллельным выполнением кода. Вот основные из них: 🟠GCD (Grand Central Dispatch) – главный инструмент для потоков GCD – это низкоуровневая технология, позволяющая управлять задачами (тасками) в очередях (DispatchQueue). DispatchQueue.global(qos: .background).async { print("Фоновый поток") DispatchQueue.main.async { print("Вернулись в главный поток") } } 🟠OperationQueue – более удобный API для задач OperationQueue – это более гибкая и объектно-ориентированная альтернатива GCD. let queue = OperationQueue() queue.maxConcurrentOperationCount = 2 // Ограничение на 2 задачи одновременно queue.addOperation { print("Операция 1") } queue.addOperation { print("Операция 2") } 🟠Actors – безопасная работа с потоками в Swift 5.5+ С actor можно работать с потоками без гонок данных, потому что все его свойства защищены от одновременного доступа. actor Counter { private var value = 0 func increment() { value += 1 } func getValue() -> Int { return value } } let counter = Counter() Task { await counter.increment() print(await counter.getValue()) // Потокобезопасный доступ } 🟠Task & Async/Await (Swift 5.5+) – современный подход к асинхронности С async/await код становится читаемым и удобным. func fetchData() async -> String { try? await Task.sleep(nanoseconds: 1_000_000_000) // 1 секунда задержки return "Данные загружены" } Task { let result = await fetchData() print(result) } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие методы борьбы есть против коллизии? Существует несколько способов разрешения коллизий: 1. Открытая адресация (open addressing) — поиск следующей свободной ячейки по определенному правилу (линейный, квадратичный пробинг). 2. Цепочки (chaining) — элементы с одинаковым хэшем хранятся в связном списке (или массиве) внутри корзины. 3. Двойное хеширование — используется вторичная хэш-функция для расчета смещения. 4. Динамическое увеличение размера таблицы (rehashing) — при увеличении нагрузки пересчитываются хэши с новым размером. Swift использует цепочки и перехэширование. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи про классы Классы — это ссылочные типы в Swift, которые позволяют создавать объекты с общими свойствами и методами. Они поддерживают наследование, работают с ARC (Automatic Reference Counting) и хранятся в куче (heap). 🚩Основные характеристики классов 🟠Ссылочный тип Когда вы присваиваете класс другой переменной, копируется не сам объект, а ссылка на него. Изменения, сделанные через одну ссылку, затронут и другие. 🟠Хранятся в куче В отличие от структур, которые хранятся в стеке, классы создают объекты в куче. Это позволяет передавать объекты между функциями без копирования. 🟠Automatic Reference Counting (ARC) Swift использует ARC для управления памятью. Объект удаляется из памяти, когда на него больше нет ссылок. 🟠Наследование В отличие от структур, классы могут наследовать свойства и методы от других классов. Поддерживают переопределение методов (override). 🟠Идентичность объектов Два объекта класса можно сравнивать по ссылке (===), а не только по значению (==). class Animal { var name: String init(name: String) { self.name = name } func speak() { print("Some sound") } } class Dog: Animal { override func speak() { print("Woof!") } } let dog1 = Dog(name: "Buddy") let dog2 = dog1 // Копируется ссылка, а не объект dog2.name = "Charlie" print(dog1.name) // "Charlie", так как dog1 и dog2 указывают на один объект Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как протоколы реализуют код? Протоколы в iOS задают интерфейс, который может быть реализован классами, структурами или перечислениями. Они не содержат реализацию, но можно использовать протоколы с расширениями (protocol extension), чтобы добавить стандартное поведение. Протоколы обеспечивают гибкость и модульность. Это позволяет разделять ответственность и переиспользовать код. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Надо ли отслеживать статус задачи в dispatchworkitem? Да, отслеживание статуса задачи в DispatchWorkItem может быть полезным, но это зависит от требований приложения. 🟠Когда это полезно? Если задача может быть отменена (cancel()) Если выполнение задачи можно приостановить или продолжить Если нужно проверить завершение перед выполнением следующего действия* let workItem = DispatchWorkItem { print("Задача выполняется") } // Запускаем задачу DispatchQueue.global().async(execute: workItem) // Отмена перед выполнением workItem.cancel() // Проверяем статус выполнения if workItem.isCancelled { print("Задача отменена") } else { print("Задача выполнена") } 🟠Можно ли проверить, завершена ли задача? В DispatchWorkItem нет метода проверки завершения. Но можно вручную отслеживать завершение с помощью notify: let workItem = DispatchWorkItem { print("Задача выполняется") } // Сообщаем о завершении workItem.notify(queue: .main) { print("Задача завершена") } DispatchQueue.global().async(execute: workItem) 🟠Надо ли всегда отслеживать статус? Если задача короткая и простая → НЕ ОБЯЗАТЕЛЬНО. Если задача важная, может быть отменена или зависит от других задач → ЛУЧШЕ ОТСЛЕЖИВАТЬ. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!