и посмотреть медиа
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.
🤔 Где фреймы наиболее яркий пример использования? Фреймы (frames) в iOS-разработке используются для задания размеров и расположения элементов интерфейса (UIView) вручную. 🟠Кастомные анимации Когда нужно анимировать движение элемента, проще всего работать с его frame, так как он напрямую управляет origin (координаты) и size (размеры). UIView.animate(withDuration: 0.5) { self.button.frame.origin.x += 100 } 🟠Ручная верстка (без Auto Layout) Если вы не используете Auto Layout или хотите задать положение элементов программно, frame позволяет точно указать размеры и координаты. let button = UIButton(type: .system) button.frame = CGRect(x: 50, y: 100, width: 200, height: 50) button.setTitle("Нажми меня", for: .normal) view.addSubview(button) 🟠Оптимизация производительности При динамической подгрузке ячеек в UITableView или UICollectionView можно вручную вычислять frame для ускорения работы, вместо использования Auto Layout, который может замедлить скроллинг. 🟠Работа с Core Graphics и CALayer При рисовании или настройке слоев CALayer используется frame, чтобы точно определить размеры слоя. let borderLayer = CALayer() borderLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100) borderLayer.borderWidth = 2 borderLayer.borderColor = UIColor.red.cgColor view.layer.addSublayer(borderLayer) Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи про кодирование и декодирование в user defaults UserDefaults — это хранилище для сохранения простых данных (строки, числа, массивы). Но если нужно сохранить сложные объекты, их сначала кодируют в `Data` (Codable), а затем сохраняют. 🟠Сохранение и загрузка простых данных Для примитивных типов (строки, числа, массивы, словари) UserDefaults работает без кодирования: let defaults = UserDefaults.standard // Сохранение defaults.set("Иван", forKey: "username") defaults.set(25, forKey: "age") // Чтение let name = defaults.string(forKey: "username") ?? "Нет имени" let age = defaults.integer(forKey: "age") print(name, age) // Иван 25 🟠Сохранение сложных объектов (Codable) Если нужно сохранить свой объект, сначала его нужно закодировать в Data. struct User: Codable { let name: String let age: Int } Сохранение в UserDefaults let user = User(name: "Иван", age: 25) let defaults = UserDefaults.standard if let encoded = try? JSONEncoder().encode(user) { defaults.set(encoded, forKey: "user") } Загрузка из UserDefaults if let savedData = defaults.data(forKey: "user"), let savedUser = try? JSONDecoder().decode(User.self, from: savedData) { print(savedUser.name, savedUser.age) // Иван 25 } 🟠Удаление данных из `UserDefaults` Чтобы удалить ключ: defaults.removeObject(forKey: "user") 🟠Сохранение массива объектов Можно сохранить массив объектов, просто закодировав его: let users = [ User(name: "Иван", age: 25), User(name: "Анна", age: 30) ] if let encoded = try? JSONEncoder().encode(users) { defaults.set(encoded, forKey: "users") } // Читаем массив обратно if let savedData = defaults.data(forKey: "users"), let savedUsers = try? JSONDecoder().decode([User].self, from: savedData) { print(savedUsers) // [{name: Иван, age: 25}, {name: Анна, age: 30}] } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Надо ли отслеживать статус задачи в 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) 🟠Надо ли всегда отслеживать статус? Если задача короткая и простая → НЕ ОБЯЗАТЕЛЬНО. Если задача важная, может быть отменена или зависит от других задач → ЛУЧШЕ ОТСЛЕЖИВАТЬ. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 В каком методе жизненного цикла можно поставить отступы к vue? Если вы хотите задать отступы (margins, padding) для UIView в жизненном цикле UIViewController, то важно выбрать правильный момент, когда размеры view уже определены. 🚩Пример установки отступов в `viewDidLayoutSubviews()` class MyViewController: UIViewController { let myView = UIView() override func viewDidLoad() { super.viewDidLoad() myView.backgroundColor = .red view.addSubview(myView) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Установка отступов (margins) myView.frame = view.bounds.insetBy(dx: 20, dy: 50) } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что означает принцип 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() } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое notification центр? Это механизм в iOS и macOS для обмена сообщениями между различными частями приложения. Он позволяет объектам отправлять и получать уведомления без необходимости напрямую ссылаться друг на друга, что способствует более гибкому и модульному дизайну. 🚩Основные аспекты 🟠Отправка уведомлений Любой объект может отправить уведомление с помощью Notification Center. Уведомления идентифицируются по имени (Notification.Name). Можно передать дополнительную информацию в виде словаря (userInfo). NotificationCenter.default.post(name: .myNotification, object: nil) 🟠Получение уведомлений Объекты могут регистрироваться для получения уведомлений с определенным именем. Для обработки уведомлений используется метод, который будет вызван при получении уведомления. NotificationCenter.default.addObserver(self, selector: #selector(handleNotification), name: .myNotification, object: nil) @objc func handleNotification(notification: Notification) { print("Received notification") } 🟠Удаление наблюдателей Важно удалять наблюдателей, когда они больше не нужны, чтобы избежать утечек памяти. Обычно это делается в методе deinit или перед уничтожением объекта. NotificationCenter.default.removeObserver(self, name: .myNotification, object: nil) 🚩Плюсы ➕Слабая связанность Объекты не нужно напрямую ссылаться друг на друга, что улучшает модульность кода. ➕Гибкость Позволяет легко организовать обмен сообщениями между различными частями приложения. ➕Повторное использование Уведомления могут использоваться многими объектами, что облегчает реализацию функций, таких как обновление интерфейса или реагирование на события. 🚩Примеры использования 1⃣Обновление интерфейса Когда данные изменяются, можно отправить уведомление для обновления пользовательского интерфейса. NotificationCenter.default.post(name: .dataDidUpdate, object: nil) 2⃣Реакция на системные события Например, можно подписаться на уведомление о смене состояния сети. NotificationCenter.default.addObserver(self, selector: #selector(handleNetworkChange), name: .reachabilityChanged, object: nil) 3⃣Межмодульное взаимодействие Различные модули приложения могут общаться друг с другом через Notification Center, не создавая сильных зависимостей. NotificationCenter.default.post(name: .userDidLogin, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(updateUI), name: .userDidLogin, object: nil) Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Может ли value type передаваться по ссылке? По умолчанию значимые типы (value types) — это структуры, перечисления, кортежи. Они передаются по значению, то есть создаётся копия. Но если обернуть value type в inout, использовать UnsafeMutablePointer или ссылочный контейнер (например, класс), то можно добиться передачи по ссылке. Однако это скорее обходное поведение, а не правило. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Почему по дефолту дабл, а не фолт? В Swift (и во многих других языках программирования) по умолчанию числовой литерал с плавающей запятой интерпретируется как `Double`, а не Float. 🚩Основные причины: 🟠Бóльшая точность Double имеет 64 бита, а Float – 32 бита. Это значит, что Double может хранить более точные значения, что особенно важно при математических вычислениях. 🟠Совместимость со стандартными API Большинство API и стандартных библиотек Swift (например, sin(), cos(), pow()) работают именно с Double. Например: let x = 3.14 // По умолчанию это Double let y = sin(x) // sin() принимает Double 🟠Производительность на современных процессорах На современных 64-битных процессорах операции с Double выполняются так же быстро или даже быстрее, чем с Float, из-за оптимизаций в аппаратном обеспечении. 🟠Меньше неожиданных ошибок округления Float может округлять числа с потерей точности, что может привести к неожиданным результатам. Пример ошибки округления в Float: let a: Float = 0.1 + 0.2 print(a == 0.3) // false 😱 🚩Как сделать `Float` вручную? Если всё же нужен Float, надо указать это явно: let number: Float = 3.14 или let number = 3.14 as Float Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что известно про Memory Graph (мемориграф)? Memory Graph в Xcode показывает живые объекты и их связи. Это полезно для поиска retain cycles, обнаружения неосвобождённых контроллеров и анализа структуры объектов. Доступен во время отладки через Debug Navigator. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!