и посмотреть медиа
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.
🤔 Что может быть ключом и значением для dictionary? Словарь (Dictionary) представляет собой коллекцию пар ключ-значение, где каждый ключ должен быть уникальным. Чтобы использовать какой-либо тип в качестве ключа словаря, этот тип должен соответствовать протоколу Hashable. Это требование обусловлено тем, что Swift использует хеш-таблицу для хранения элементов словаря, что обеспечивает быстрый доступ к его элементам. 🚩Ключи Должны быть уникальными: Каждый ключ в словаре должен быть уникальным. При попытке добавить в словарь элемент с ключом, который уже существует в словаре, старое значение будет заменено на новое. Должны соответствовать протоколу Hashable: Это означает, что тип ключа должен иметь способность быть правильно хешированным. Большинство базовых типов Swift (например, String, Int, Double и др.) уже соответствуют Hashable, поэтому их можно использовать в качестве ключей без дополнительных усилий. 🚩Значения Могут быть любого типа: Значения в словаре могут быть любого типа, и они не обязаны соответствовать протоколу Hashable. Могут повторяться: Разные ключи могут иметь одинаковые значения. var personAge: [String: Int] = ["John": 30, "Sara": 25] 🚩Собственные типы в качестве ключей Вы также можете использовать собственные пользовательские типы в качестве ключей словаря, но для этого ваш тип должен соответствовать протоколу Hashable. Это включает в себя реализацию требуемых методов для сравнения на равенство (==) и хеширования (hash(into:)). struct Person: Hashable { var name: String var id: Int } var peopleDictionary: [Person: String] = [Person(name: "John", id: 1): "Engineer"] Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как работает UITableView? - Использует реиспользуемые ячейки (dequeueReusableCell) для оптимизации памяти. - Работает с делегатами (UITableViewDelegate) и источниками данных (UITableViewDataSource) для динамического обновления контента. - Поддерживает разделы, перетаскивание, редактирование. - Может быть обновлен с анимацией (reloadData, performBatchUpdates). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Зачем нужны слабые ссылки? Слабые ссылки (weak references) играют важную роль в управлении памятью, особенно когда нужно предотвратить циклы сильных ссылок (retain cycles) и утечки памяти. 🚩Основные причины использования 🟠Предотвращение циклов сильных ссылок Циклы сильных ссылок возникают, когда два объекта держат сильные ссылки друг на друга, что препятствует их освобождению из памяти. Слабые ссылки разрывают этот цикл, позволяя одному из объектов освобождаться. class Person { var name: String weak var friend: Person? init(name: String) { self.name = name } } var alice: Person? = Person(name: "Alice") var bob: Person? = Person(name: "Bob") alice?.friend = bob bob?.friend = alice alice = nil // Теперь объекты могут быть освобождены bob = nil 🟠Избежание утечек памяти Утечки памяти происходят, когда объекты, которые больше не нужны, не освобождаются из памяти. Слабые ссылки помогают избежать этих утечек, обеспечивая правильное освобождение памяти. Делегаты часто объявляются как слабые ссылки, чтобы избежать утечек памяти. protocol TaskDelegate: AnyObject { func taskDidFinish() } class Task { weak var delegate: TaskDelegate? func complete() { delegate?.taskDidFinish() } } class ViewController: TaskDelegate { var task = Task() init() { task.delegate = self } func taskDidFinish() { print("Task finished") } } 🟠Управление временными зависимостями Слабые ссылки удобны для временных зависимостей, когда объект не должен удерживаться в памяти, если нет других сильных ссылок. Использование слабых ссылок для временных объектов. class Cache { weak var temporaryObject: SomeClass? } class SomeClass { // Код класса } var cache = Cache() var object = SomeClass() cache.temporaryObject = object object = SomeClass() // Старый объект удаляется, так как на него нет сильных ссылок 🚩Плюсы и минусы ➕Предотвращение циклов ссылок Основное преимущество слабых ссылок заключается в их способности разрывать циклы ссылок, предотвращая утечки памяти. ➕Обеспечение корректного управления памятью Слабые ссылки позволяют объектам освобождаться из памяти, когда на них больше нет сильных ссылок, что улучшает управление ресурсами. ➕Гибкость и безопасность Использование слабых ссылок обеспечивает более гибкое и безопасное управление зависимостями между объектами. ➖Сложности управления Необходимо учитывать, что слабые ссылки могут стать nil в любой момент, поэтому требуется дополнительная проверка. ➖Понимание жизненного цикла объектов Требуется хорошее понимание жизненного цикла объектов и управления памятью, чтобы правильно использовать слабые ссылки. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как запустить поток? Запустить поток можно разными способами: - Использовать асинхронную задачу или очередь, чтобы выполнить код в фоне. - В многопоточной среде — создать новый поток, задачу или использовать пул потоков. - В Swift это можно сделать с помощью DispatchQueue, Task или OperationQueue. Важно помнить, что всё, что связано с UI, должно выполняться в основном потоке. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие паттерны знаешь? Паттерны проектирования – это готовые решения частых задач, улучшающие структуру кода, его поддержку и масштабируемость. 🚩Порождающие паттерны (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 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Зачем нужен UIView, если есть layer? UIView — это высокоуровневая оболочка, которая управляет взаимодействием, событиями, отрисовкой, а CALayer — низкоуровневая графическая часть. Через UIView проще управлять UI и логикой, layer — для кастомной графики и анимаций. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи про классы Классы — это ссылочные типы в 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 указывают на один объект Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!