и посмотреть медиа
Preguntas de entrevista de Swift
и посмотреть медиа
Preguntas, pruebas y tareas para desarrolladores de iOS en Telegram.
Preguntas, pruebas y tareas para desarrolladores de iOS en Telegram.
bot de IA para clonar texto a voz y voz en Telegram. Cree audio utilizando la red neuronal de forma rápida y fácil.
El canal está dedicado a la preparación de entrevistas en idioma Swift. Contiene preguntas actuales, pruebas, tareas prácticas e información de vacantes. Ideal para desarrolladores iOS principiantes y experimentados que quieren refrescar sus conocimientos y pasar con éxito entrevistas.
🤔 Какие объекты участвуют в зависимостях? В зависимости от контекста, под "объектами, участвующими в зависимостях" можно понимать различные концепции. В программировании под зависимостями чаще всего подразумеваются связи между объектами или модулями, где один объект зависит от другого для выполнения своих функций. 🚩Объект-зависимый и объект-зависимость Когда один объект (например, ViewController) зависит от другого (NetworkManager), первый становится клиентом, а второй – зависимостью. class NetworkManager { func fetchData() { print("Данные загружены") } } class ViewController { let networkManager: NetworkManager init(networkManager: NetworkManager) { self.networkManager = networkManager } func loadData() { networkManager.fetchData() } } 🚩Протоколы как способ ослабления зависимостей Жесткие зависимости можно ослабить, используя протоколы. protocol NetworkService { func fetchData() } class NetworkManager: NetworkService { func fetchData() { print("Данные загружены") } } class ViewController { let networkService: NetworkService init(networkService: NetworkService) { self.networkService = networkService } func loadData() { networkService.fetchData() } } 🚩Зависимости в архитектурах (MVVM, VIPER, DI) В MVVM зависимость между ViewController и ViewModel. В VIPER модули зависят друг от друга, но слабо связаны через протоколы. В DI (Dependency Injection) зависимости передаются снаружи, что повышает тестируемость и гибкость. 🚩Менеджеры зависимостей Чтобы управлять внешними зависимостями (библиотеками), используются Swift Package Manager (SPM) CocoaPods Carthage Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 В чём разница между as, as! и as? Эти три оператора связаны с приведением типов: - as используется для безопасного восходящего приведения, когда тип объекта гарантированно может быть приведён к указанному типу (например, суперклассу или протоколу). - as! — это принудительное нисходящее приведение. Оно требует уверенности в типе объекта, иначе приложение упадёт при ошибке. - as? — это безопасное нисходящее приведение, при котором результат будет опционалом. Если приведение невозможно, возвращается nil. Таким образом: - as — безопасно и для "поднятия" вверх по иерархии. - as! — рискованно, используется только если уверен в типе. - as? — гибко и безопасно, но требует работы с опционалом. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Для каких сущностей работает copy on write? Механизм Copy-on-Write (CoW) используется для оптимизации производительности и использования памяти при копировании объектов. Этот механизм особенно полезен для неизменяемых (immutable) структур данных. CoW часто ассоциируется со стандартными коллекциями и собственными типами данных, реализованными как структуры (value types), такие как Array, String, Dictionary, и Set. 🚩Принцип работы Copy-on-Write Работает так, что копия объекта создаётся только в тот момент, когда происходит попытка модификации. До этого момента все копии объекта фактически ссылаются на одни и те же данные в памяти. Это позволяет сэкономить как время, так и память, поскольку избегается ненужное дублирование данных, когда оно не требуется. 🚩Как это работает в Swift Автоматически применяет механизм CoW к своим стандартным коллекциям, таким как Array, String, Dictionary, и Set. Это означает, что при передаче этих объектов в функции или при их копировании реальное дублирование данных происходит только в случае модификации одной из копий. Таким образом, если вы создаёте копию массива и не изменяете его, обе переменные будут указывать на одни и те же данные в памяти. Как только вы модифицируете одну из копий, Swift создаст реальную копию данных для этой копии, обеспечивая независимость данных между оригиналом и копией. var originalArray = [1, 2, 3] var copiedArray = originalArray // На этом этапе данные не дублируются copiedArray.append(4) // Теперь данные копируются, потому что copiedArray модифицируется Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие ещё бывают type? – Int, Double, String, Bool — базовые типы, – struct, class, enum, tuple, – Optional, – Protocol, – Function, – Any, AnyObject, Never. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи про механизм отмены в operatsion В Operation (ранее NSOperation) в Foundation есть встроенный механизм отмены, который позволяет корректно завершить операцию, если она больше не нужна. Однако отмена не прерывает выполнение автоматически – код внутри операции должен сам проверять флаг отмены и корректно завершаться. 🚩Как работает отмена `Operation`? Вызывается cancel() – операция помечается как отмененная. Флаг isCancelled становится true, но операция продолжает выполняться, если не проверяет этот флаг. Операция должна самостоятельно проверять isCancelled и прерываться. class MyOperation: Operation { override func main() { for i in 1...10 { if isCancelled { return } // Проверяем, отменена ли операция print("Выполняется шаг \(i)") sleep(1) // Симуляция работы } } } let queue = OperationQueue() let operation = MyOperation() queue.addOperation(operation) DispatchQueue.main.asyncAfter(deadline: .now() + 3) { operation.cancel() // Отменяем через 3 секунды } 🚩Отмена асинхронных операций Если операция асинхронная (isAsynchronous = true), просто проверять isCancelled недостаточно. Надо корректно управлять состояниями (isExecuting, isFinished). class AsyncOperation: Operation { private var _executing = false private var _finished = false override var isAsynchronous: Bool { true } override var isExecuting: Bool { get { return _executing } set { willChangeValue(for: \.isExecuting) _executing = newValue didChangeValue(for: \.isExecuting) } } override var isFinished: Bool { get { return _finished } set { willChangeValue(for: \.isFinished) _finished = newValue didChangeValue(for: \.isFinished) } } override func start() { if isCancelled { isFinished = true return } isExecuting = true executeTask() } private func executeTask() { DispatchQueue.global().asyncAfter(deadline: .now() + 3) { if self.isCancelled { self.complete() return } print("Асинхронная операция завершена") self.complete() } } private func complete() { isExecuting = false isFinished = true } } let queue = OperationQueue() let asyncOp = AsyncOperation() queue.addOperation(asyncOp) DispatchQueue.main.asyncAfter(deadline: .now() + 1) { asyncOp.cancel() // Отменяем через 1 секунду } 🚩Отмена зависимых операций Если у вас есть зависимости между операциями, отмена одной может автоматически отменить все последующие: let op1 = MyOperation() let op2 = MyOperation() op2.addDependency(op1) let queue = OperationQueue() queue.addOperations([op1, op2], waitUntilFinished: false) // Отменяем первую операцию, вторая тоже не выполнится op1.cancel() Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи про capture list? Capture list в замыканиях Swift используется для управления захватом переменных, предотвращая сильные ссылки ([weak self]) или обеспечивая их копирование ([x]). Это помогает управлять памятью и избегать утечек. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Где могут располагаться стеки помимо структуры В программировании стек (stack) — это структура данных и область памяти, используемая для хранения временных данных. В зависимости от контекста, стек может существовать в нескольких местах. 🟠Стек вызовов (Call Stack) Это главная область памяти в оперативной памяти (RAM), где хранятся: - Локальные переменные функций. - Адреса возврата после завершения функции. - Контекст выполнения программы. func functionA() { functionB() } func functionB() { print("Вызов B") } functionA() func infiniteRecursion() { infiniteRecursion() // ❌ Бесконечный вызов } 🟠Стек в структуре данных (например, `Array`) В Swift можно реализовать стек вручную, используя массив (Array). struct Stack { private var elements: [T] = [] mutating func push(_ item: T) { elements.append(item) } mutating func pop() -> T? { return elements.popLast() } } var stack = Stack() stack.push(10) stack.push(20) print(stack.pop()!) // 20 🟠Потоковый стек (Thread Stack) Каждый поток (Thread) в многопоточном программировании получает свой стек. DispatchQueue.global().async { print("Фоновый поток") } print("Главный поток") 🟠Стек в автоматическом управлении памятью (ARC) Swift использует Automatic Reference Counting (ARC) для управления памятью. Когда объект больше не нужен, он удаляется из памяти (в том числе из стека). func createPerson() { let person = "Иван" // Создаётся в стеке print(person) } createPerson() // Переменная person удаляется при выходе из функции Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 В каких моментах жизненного цикла лучше поместить подписку? Подписку на уведомления (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) } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие есть известные проблемы с многопоточностью? Известные проблемы с многопоточностью включают гонки данных, блокировки и взаимоблокировки (deadlocks). Гонки данных происходят, когда несколько потоков одновременно пытаются изменить одни и те же данные без должной синхронизации. Блокировки возникают, когда потоки ждут освобождения ресурсов друг от друга, что замедляет работу программы. Взаимоблокировки случаются, когда два потока захватывают ресурсы и не могут завершить работу из-за зависимостей. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!