и посмотреть медиа
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.
🤔 В чем особенность верстки каждой ячейки на фрейме? При верстке UITableViewCell через фреймы приходится вручную рассчитывать все размеры и положения элементов. Это быстрее по производительности, но требует точности и большой ответственности при адаптации под разные экраны. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи про структуры Структуры (struct) – это один из основных типов данных в Swift. Они значимые (value type), то есть при передаче копируются, а не передаются по ссылке. 🚩Главные особенности `struct` Value type – при передаче копируется (в отличие от классов) Нет ARC (автоматического подсчета ссылок) – производительность выше Могут иметь методы, свойства, инициализаторы Работают с протоколами (protocol-oriented programming) Не поддерживают наследование 🚩Пример структуры struct Car { var model: String var year: Int func description() -> String { return "\(model) – \(year)" } } let car1 = Car(model: "Tesla", year: 2023) var car2 = car1 // Создается копия print(car1.description()) // Tesla – 2023 print(car2.description()) // Tesla – 2023 car2.year = 2024 // Изменяем car2, но car1 остается прежним print(car1.year) // 2023 print(car2.year) // 2024 🚩Мутируемые структуры (`mutating`) По умолчанию методы не могут изменять свойства структуры. Чтобы изменить их внутри метода, нужно использовать mutating struct Counter { var count = 0 mutating func increment() { count += 1 } } var counter = Counter() counter.increment() print(counter.count) // 1 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие минусы ООП? – Сложность при большом количестве классов, – Избыточное наследование, – Низкая гибкость при изменении структуры, – Возможные циклы зависимостей, – Переусложнение при решении простых задач. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что означает принцип open closed? Принцип OCP (Open-Closed Principle) гласит: "Программные сущности должны быть открыты для расширения, но закрыты для модификации." Это значит, что код должен позволять добавлять новый функционал без изменения существующего кода. 🚩Почему это важно? Меньше багов – изменения не ломают старый код. Лучшая поддержка – новый функционал добавляется без переписывания старого. Гибкость – можно расширять систему без изменения её базовой логики. 🚩Пример нарушения принципа OCP Допустим, у нас есть класс, который рисует фигуры: class ShapeDrawer { func draw(shape: String) { if shape == "circle" { print("Рисуем круг") } else if shape == "square" { print("Рисуем квадрат") } } } 🚩Как исправить? Используем OCP! Лучше использовать наследование или протоколы, чтобы расширять функциональность, не меняя существующий код: protocol Drawable { func draw() } class Circle: Drawable { func draw() { print("Рисуем круг") } } class Square: Drawable { func draw() { print("Рисуем квадрат") } } class ShapeDrawer { func draw(shape: Drawable) { shape.draw() } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Если нужен максимальный контроль над потоками, что можно использовать? Для максимального контроля используют POSIX-потоки (pthread), OperationQueue с кастомной реализацией или GCD с DispatchWorkItem и приоритетами. Также можно использовать NSLock, semaphore и dispatch group. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 В каких моментах жизненного цикла лучше поместить подписку? Подписку на уведомления (NotificationCenter), KVO или Combine в жизненном цикле UIViewController лучше размещать в методах, где гарантируется её актуальность и корректное удаление. 🟠Подписка в `viewDidLoad()` Подписка на события обычно происходит в `viewDidLoad()`, так как этот метод вызывается один раз при создании контроллера. override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(handleNotification), name: .someNotification, object: nil ) } @objc func handleNotification(_ notification: Notification) { print("Получено уведомление") } 🟠Подписка в `viewWillAppear()` – если уведомления нужны только при отображении экрана Если подписка должна работать только когда экран на экране, используем viewWillAppear(). var cancellable: AnyCancellable? override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) cancellable = NotificationCenter.default.publisher(for: .someNotification) .sink { _ in print("Событие получено") } } 🟠`viewWillDisappear()` – отписка от событий Когда контроллер скрывается, подписки можно удалить, чтобы избежать ненужных вызовов. Удаление подписки на NotificationCenter: override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self, name: .someNotification, object: nil) } Удаление Combine подписки (cancellable) override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) cancellable?.cancel() cancellable = nil } 🟠`deinit` – отписка, если подписка создаётся в `viewDidLoad()` Если подписка работает на протяжении всего жизненного цикла контроллера, её можно удалить в `deinit`. deinit { NotificationCenter.default.removeObserver(self) } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Почему порядок ключей будет сохраняться между мутациями в словаре? Начиная с Swift 4, стандартный Dictionary сохраняет порядок вставки ключей. Даже при изменении значений или добавлении новых элементов порядок сохраняется, пока явным образом не удаляются ключи или не происходит массовая перераспределённая перестройка. Это стало возможным благодаря обновлённой реализации хеш-таблицы внутри Dictionary. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие паттерны знаешь? Паттерны проектирования – это готовые решения частых задач, улучшающие структуру кода, его поддержку и масштабируемость. 🚩Порождающие паттерны (Creational) Помогают упростить создание объектов и сделать его гибким. Определяет интерфейс для создания объекта, но поручает подклассам выбрать его тип. protocol Button { func press() } class iOSButton: Button { func press() { print("iOS button pressed") } } class AndroidButton: Button { func press() { print("Android button pressed") } } class ButtonFactory { static func createButton(for os: String) -> Button { return os == "iOS" ? iOSButton() : AndroidButton() } } let button = ButtonFactory.createButton(for: "iOS") button.press() // "iOS button pressed" 🟠Одиночка (Singleton) Гарантирует, что у класса будет только один экземпляр. class Database { static let shared = Database() // Единственный экземпляр private init() { } func query() { print("Запрос в базу данных") } } Database.shared.query() 🟠Строитель (Builder) Позволяет пошагово создавать сложные объекты. class Burger { var cheese = false var bacon = false } class BurgerBuilder { private var burger = Burger() func addCheese() -> Self { burger.cheese = true return self } func addBacon() -> Self { burger.bacon = true return self } func build() -> Burger { return burger } } let myBurger = BurgerBuilder().addCheese().addBacon().build() print(myBurger.cheese) // true print(myBurger.bacon) // true 🚩Структурные паттерны (Structural) Определяют удобные способы связи между объектами. 🟠Адаптер (Adapter) Позволяет совместить несовместимые интерфейсы. protocol EuropeanSocket { func provide220V() } class EuropeanPlug: EuropeanSocket { func provide220V() { print("220V подано") } } class USPlug { func provide110V() { print("110V подано") } } // Адаптер для американской вилки class USAdapter: EuropeanSocket { private let usPlug: USPlug init(usPlug: USPlug) { self.usPlug = usPlug } func provide220V() { usPlug.provide110V() print("Адаптация до 220V") } } let adapter = USAdapter(usPlug: USPlug()) adapter.provide220V() // "110V подано" // "Адаптация до 220V" 🟠Декоратор (Decorator) Динамически добавляет объекту новое поведение. protocol Coffee { func cost() -> Int } class SimpleCoffee: Coffee { func cost() -> Int { return 100 } } // Декоратор "Молоко" class MilkDecorator: Coffee { private let coffee: Coffee init(_ coffee: Coffee) { self.coffee = coffee } func cost() -> Int { return coffee.cost() + 30 } } let coffee = MilkDecorator(SimpleCoffee()) print(coffee.cost()) // 130 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое method dispatch? Method dispatch — это механизм, определяющий, какая реализация метода будет вызвана во время исполнения. Бывает: - Static dispatch — выбор метода происходит на этапе компиляции (быстрее). - Dynamic dispatch — через таблицу виртуальных функций (vtable), работает с наследованием, позволяет переопределение. - Message dispatch — как в Objective-C, через objc_msgSend. Swift использует комбинацию подходов в зависимости от контекста (классы, final, протоколы). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!