Anonymous Quiz
13%
будет проинициализировано при объявлении
1%
никогда не будет проинициализировано
3%
будет проинициализировано только в init
83%
будет проинициализировано при первом доступе
Как ловить утечки памяти ?
Спросят с вероятностью 18%
Утечки памяти могут стать серьезной проблемой, особенно в больших и сложных приложениях. Они происходят, когда выделенная память не освобождается, даже если она больше не используется. Существуют различные инструменты и техники для обнаружения и устранения утечек памяти.
1️⃣Инструменты профайлинга
Большинство современных сред разработки (IDE) и платформ предоставляют инструменты для профайлинга памяти:
✅Xcode Instruments (для iOS и macOS): Используйте инструмент "Leaks" для обнаружения утечек памяти в приложениях на базе iOS или macOS. Он может помочь выявить не только утечки, но и другие проблемы, связанные с памятью, такие как чрезмерное использование памяти и зацикливание ссылок.
✅Android Studio Profiler: Для Android-разработчиков Android Studio предлагает инструменты для мониторинга использования памяти приложениями, выявления утечек и анализа содержимого кучи.
✅Valgrind: Это мощный инструмент анализа памяти для программ на C и C++. Он помогает обнаруживать утечки памяти, неправильное использование памяти и другие связанные с памятью ошибки.
✅Visual Studio Diagnostic Tools: Для разработчиков на C# и .NET Visual Studio предлагает инструменты диагностики, которые включают профайлеры памяти и производительности.
2️⃣Код-ревью и лучшие практики
Помогает выявить потенциальные утечки памяти до того, как код будет запущен:
✅Избегайте зацикленных ссылок, особенно в языках, поддерживающих автоматический подсчет ссылок, таких как Swift и Objective-C.
✅Используйте слабые (weak) и неуправляемые (unowned) ссылки для предотвращения сильных ссылочных циклов.
✅В C++ используйте умные указатели (
3️⃣Статические анализаторы кода
Могут обнаруживать утечки памяти на этапе разработки:
✅Clang Static Analyzer для C и Objective-C.
✅Cppcheck, Coverity и другие для C++.
✅SonarQube для различных языков программирования.
4️⃣Юнит-тестирование
Проверяют не только функциональность, но и производительность и управление памятью:
✅Тесты могут включать проверки на утечки памяти после выполнения определенных функций или после создания и уничтожения объектов.
✅Используйте библиотеки и фреймворки, которые поддерживают этот тип тестирования.
5️⃣Регулярный мониторинг и логирование
Для серверных и долгоживущих приложений регулярно мониторьте использование памяти и логируйте информацию о состоянии системы:
✅Используйте системы мониторинга, такие как Prometheus, для отслеживания метрик памяти в продакшн.
✅Логируйте предупреждения, если использование памяти превышает ожидаемые пороги.
Обнаружение и устранение утечек памяти требует комплексного подхода, включающего как использование специализированных инструментов, так и применение лучших практик программирования. Инвестиции в профилактику и раннее обнаружение утечек могут значительно снизить затраты и усилия, связанные с поддержкой и обслуживанием программного обеспечения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Утечки памяти могут стать серьезной проблемой, особенно в больших и сложных приложениях. Они происходят, когда выделенная память не освобождается, даже если она больше не используется. Существуют различные инструменты и техники для обнаружения и устранения утечек памяти.
1️⃣Инструменты профайлинга
Большинство современных сред разработки (IDE) и платформ предоставляют инструменты для профайлинга памяти:
✅Xcode Instruments (для iOS и macOS): Используйте инструмент "Leaks" для обнаружения утечек памяти в приложениях на базе iOS или macOS. Он может помочь выявить не только утечки, но и другие проблемы, связанные с памятью, такие как чрезмерное использование памяти и зацикливание ссылок.
✅Android Studio Profiler: Для Android-разработчиков Android Studio предлагает инструменты для мониторинга использования памяти приложениями, выявления утечек и анализа содержимого кучи.
✅Valgrind: Это мощный инструмент анализа памяти для программ на C и C++. Он помогает обнаруживать утечки памяти, неправильное использование памяти и другие связанные с памятью ошибки.
✅Visual Studio Diagnostic Tools: Для разработчиков на C# и .NET Visual Studio предлагает инструменты диагностики, которые включают профайлеры памяти и производительности.
2️⃣Код-ревью и лучшие практики
Помогает выявить потенциальные утечки памяти до того, как код будет запущен:
✅Избегайте зацикленных ссылок, особенно в языках, поддерживающих автоматический подсчет ссылок, таких как Swift и Objective-C.
✅Используйте слабые (weak) и неуправляемые (unowned) ссылки для предотвращения сильных ссылочных циклов.
✅В C++ используйте умные указатели (
std::unique_ptr, std::shared_ptr) для автоматического управления памятью.3️⃣Статические анализаторы кода
Могут обнаруживать утечки памяти на этапе разработки:
✅Clang Static Analyzer для C и Objective-C.
✅Cppcheck, Coverity и другие для C++.
✅SonarQube для различных языков программирования.
4️⃣Юнит-тестирование
Проверяют не только функциональность, но и производительность и управление памятью:
✅Тесты могут включать проверки на утечки памяти после выполнения определенных функций или после создания и уничтожения объектов.
✅Используйте библиотеки и фреймворки, которые поддерживают этот тип тестирования.
5️⃣Регулярный мониторинг и логирование
Для серверных и долгоживущих приложений регулярно мониторьте использование памяти и логируйте информацию о состоянии системы:
✅Используйте системы мониторинга, такие как Prometheus, для отслеживания метрик памяти в продакшн.
✅Логируйте предупреждения, если использование памяти превышает ожидаемые пороги.
Обнаружение и устранение утечек памяти требует комплексного подхода, включающего как использование специализированных инструментов, так и применение лучших практик программирования. Инвестиции в профилактику и раннее обнаружение утечек могут значительно снизить затраты и усилия, связанные с поддержкой и обслуживанием программного обеспечения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤1
Что такое reference types ?
Спросят с вероятностью 55%
Ссылочные типы (reference types) — это типы данных, экземпляры которых хранят не само значение, а ссылку на область в памяти, где это значение расположено. Это означает, что при присваивании переменной или передаче аргумента функции копируется не само значение, а ссылка на него. В результате, если вы измените данные в одном месте через одну переменную, изменения отразятся и на всех других переменных, которые ссылаются на это же место в памяти.
Ссылочные типы включают:
✅Классы (
Пример:
В этом примере
Использование ссылочных типов позволяет различным частям программы совместно использовать и изменять данные без необходимости создавать множество копий. Это особенно полезно для сложных структур данных и при работе с большими объемами данных, когда копирование значений может быть ресурсоемким.
Однако, совместное использование данных может привести к ошибкам, если несколько частей программы изменяют данные неожиданным образом. Также важно учитывать жизненный цикл объекта, поскольку неправильное управление памятью может привести к утечкам памяти или другим проблемам.
Ссылочные типы представляют собой типы данных, которые хранят ссылку на значение в памяти, а не само значение. Это позволяет разным частям программы совместно использовать и изменять одни и те же данные. Ссылочные типы полезны для работы с большими и сложными данными, но требуют осторожного управления для избежания ошибок совместного использования и утечек памяти.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 55%
Ссылочные типы (reference types) — это типы данных, экземпляры которых хранят не само значение, а ссылку на область в памяти, где это значение расположено. Это означает, что при присваивании переменной или передаче аргумента функции копируется не само значение, а ссылка на него. В результате, если вы измените данные в одном месте через одну переменную, изменения отразятся и на всех других переменных, которые ссылаются на это же место в памяти.
Ссылочные типы включают:
✅Классы (
class)Пример:
class MyClass {
var number: Int
init(number: Int) {
self.number = number
}
}
var a = MyClass(number: 5)
var b = a
b.number = 10
print(a.number) // Выведет 10
print(b.number) // Также выведет 10В этом примере
a и b ссылаются на один и тот же экземпляр класса MyClass. Изменение b.number приводит к изменению a.number, поскольку обе переменные ссылаются на один и тот же объект в памяти.Использование ссылочных типов позволяет различным частям программы совместно использовать и изменять данные без необходимости создавать множество копий. Это особенно полезно для сложных структур данных и при работе с большими объемами данных, когда копирование значений может быть ресурсоемким.
Однако, совместное использование данных может привести к ошибкам, если несколько частей программы изменяют данные неожиданным образом. Также важно учитывать жизненный цикл объекта, поскольку неправильное управление памятью может привести к утечкам памяти или другим проблемам.
Ссылочные типы представляют собой типы данных, которые хранят ссылку на значение в памяти, а не само значение. Это позволяет разным частям программы совместно использовать и изменять одни и те же данные. Ссылочные типы полезны для работы с большими и сложными данными, но требуют осторожного управления для избежания ошибок совместного использования и утечек памяти.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
17%
nil
69%
пустой массив
11%
исходный массив
3%
генерируется ошибка
Какие ссылки есть у нас изначально ?
Спросят с вероятностью 18%
Обычно обсуждаются два основных типа ссылок: сильные (strong) и слабые (weak) ссылки. В некоторых контекстах также упоминаются неуправляемые (unowned) и мягкие (soft) ссылки. Давайте рассмотрим каждый тип ссылок подробнее, чтобы лучше понять их природу и использование.
1️⃣Сильные ссылки (Strong References)
✅Определение: Сильные ссылки — это самый обычный тип ссылок, который не только указывает на объект, но и активно удерживает его в памяти. Пока на объект существует хотя бы одна сильная ссылка, объект не будет уничтожен сборщиком мусора (в языках с автоматическим управлением памятью) или останется валидным (в языках с ручным управлением памятью).
✅Использование: В большинстве случаев используются сильные ссылки, когда нужно гарантировать, что объект остается в памяти в течение всего времени его необходимости.
2️⃣Слабые ссылки (Weak References)
✅Определение: Слабые ссылки не удерживают объект в памяти. Если на объект нет других сильных ссылок, он будет уничтожен, даже если на него указывают слабые ссылки. В момент уничтожения объекта все слабые ссылки автоматически становятся
✅Использование: Слабые ссылки часто используются для разрешения циклов сильных ссылок в объектных графах, например, когда два объекта взаимно ссылаются друг на друга.
3️⃣Неуправляемые ссылки (Unowned References)
✅Определение: Неуправляемые ссылки похожи на слабые, но они не обнуляются, когда объект уничтожается. Это означает, что они могут указывать на уже освобожденную память, что опасно.
✅Использование: Неуправляемые ссылки используются, когда вы уверены, что ссылка будет использоваться только пока существует объект. Их использование требует осторожности, чтобы избежать ошибок доступа к памяти.
4️⃣Мягкие ссылки (Soft References) (применимо к Java)
✅Определение: Мягкие ссылки в Java автоматически удаляются, если JVM (Java Virtual Machine) нужно освободить память. Мягкие ссылки удерживают объект в памяти, пока есть достаточно памяти.
✅Использование: Обычно мягкие ссылки используются для реализации кэшей.
Пример:
Эти типы ссылок имеют критическое значение в управлении памятью и предотвращении утечек памяти в приложениях, особенно в сложных системах с множеством взаимосвязанных объектов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Обычно обсуждаются два основных типа ссылок: сильные (strong) и слабые (weak) ссылки. В некоторых контекстах также упоминаются неуправляемые (unowned) и мягкие (soft) ссылки. Давайте рассмотрим каждый тип ссылок подробнее, чтобы лучше понять их природу и использование.
1️⃣Сильные ссылки (Strong References)
✅Определение: Сильные ссылки — это самый обычный тип ссылок, который не только указывает на объект, но и активно удерживает его в памяти. Пока на объект существует хотя бы одна сильная ссылка, объект не будет уничтожен сборщиком мусора (в языках с автоматическим управлением памятью) или останется валидным (в языках с ручным управлением памятью).
✅Использование: В большинстве случаев используются сильные ссылки, когда нужно гарантировать, что объект остается в памяти в течение всего времени его необходимости.
2️⃣Слабые ссылки (Weak References)
✅Определение: Слабые ссылки не удерживают объект в памяти. Если на объект нет других сильных ссылок, он будет уничтожен, даже если на него указывают слабые ссылки. В момент уничтожения объекта все слабые ссылки автоматически становятся
nil или null, что предотвращает появление "висячих" ссылок.✅Использование: Слабые ссылки часто используются для разрешения циклов сильных ссылок в объектных графах, например, когда два объекта взаимно ссылаются друг на друга.
3️⃣Неуправляемые ссылки (Unowned References)
✅Определение: Неуправляемые ссылки похожи на слабые, но они не обнуляются, когда объект уничтожается. Это означает, что они могут указывать на уже освобожденную память, что опасно.
✅Использование: Неуправляемые ссылки используются, когда вы уверены, что ссылка будет использоваться только пока существует объект. Их использование требует осторожности, чтобы избежать ошибок доступа к памяти.
4️⃣Мягкие ссылки (Soft References) (применимо к Java)
✅Определение: Мягкие ссылки в Java автоматически удаляются, если JVM (Java Virtual Machine) нужно освободить память. Мягкие ссылки удерживают объект в памяти, пока есть достаточно памяти.
✅Использование: Обычно мягкие ссылки используются для реализации кэшей.
Пример:
class Person {
let name: String
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
var reference1: Person?
var reference2: Person?
var reference3: Person?
reference1 = Person(name: "John Doe") // Сильная ссылка
reference2 = reference1 // Еще одна сильная ссылка
reference3 = reference1 // Еще одна сильная ссылка
reference1 = nil
reference2 = nil
reference3 = nil // Объект уничтожается только после удаления последней сильной ссылкиЭти типы ссылок имеют критическое значение в управлении памятью и предотвращении утечек памяти в приложениях, особенно в сложных системах с множеством взаимосвязанных объектов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤2🔥1🤔1
Что такое cherrypick ?
Спросят с вероятностью 18%
"cherry-pick" означает выборочное применение одного или нескольких коммитов из одной ветки кода в другую ветку. Это особенно полезно, когда вам нужно внести определённые изменения из одной ветки в другую, но не нужно переносить все изменения.
Как он работает
Допустим, у вас есть две ветки в вашем репозитории:
Пример:
Здесь
Причины его использовать
1️⃣Изолированные исправления: Если вы обнаружили ошибку, которая была исправлена в одной ветке, и вам нужно быстро применить это исправление в другую ветку (например, из
2️⃣Конфликты: В процессе него могут возникнуть конфликты, особенно если существующие изменения в целевой ветке не совместимы с изменениями в его коммите. Эти конфликты необходимо разрешить вручную.
3️⃣Контроль: Дает более тонкий контроль над тем, какие именно изменения вы хотите внести в ветку, что удобно в больших и сложных проектах.
Недостатки:
✅Управление историей: Может привести к запутанной истории коммитов, особенно если одни и те же изменения применяются в различных ветках. Это может усложнить отладку и отслеживание изменений.
✅Риск конфликтов: Может вызвать конфликты, которые нужно будет решать вручную, и это может стать проблемой в больших проектах с множеством активных веток.
Cherry-picking — мощный инструмент, но его следует использовать осторожно и с пониманием потенциальных последствий для управления проектом и истории изменений.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
"cherry-pick" означает выборочное применение одного или нескольких коммитов из одной ветки кода в другую ветку. Это особенно полезно, когда вам нужно внести определённые изменения из одной ветки в другую, но не нужно переносить все изменения.
Как он работает
Допустим, у вас есть две ветки в вашем репозитории:
master и feature. Вы хотите перенести специфическое изменение из feature в master, не затрагивая другие изменения, сделанные в feature. Вы можете использоватьего для выборочного применения этого изменения.Пример:
git checkout master # Переключитесь на ветку master
git cherry-pick <commit> # Примените коммит из ветки feature
Здесь
<commit> — это идентификатор коммита (например, хеш), который вы хотите "поднять" и применить к ветке master.Причины его использовать
1️⃣Изолированные исправления: Если вы обнаружили ошибку, которая была исправлена в одной ветке, и вам нужно быстро применить это исправление в другую ветку (например, из
development в production), cherry-pick позволяет это сделать без переноса других изменений.2️⃣Конфликты: В процессе него могут возникнуть конфликты, особенно если существующие изменения в целевой ветке не совместимы с изменениями в его коммите. Эти конфликты необходимо разрешить вручную.
3️⃣Контроль: Дает более тонкий контроль над тем, какие именно изменения вы хотите внести в ветку, что удобно в больших и сложных проектах.
Недостатки:
✅Управление историей: Может привести к запутанной истории коммитов, особенно если одни и те же изменения применяются в различных ветках. Это может усложнить отладку и отслеживание изменений.
✅Риск конфликтов: Может вызвать конфликты, которые нужно будет решать вручную, и это может стать проблемой в больших проектах с множеством активных веток.
Cherry-picking — мощный инструмент, но его следует использовать осторожно и с пониманием потенциальных последствий для управления проектом и истории изменений.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤2
Anonymous Quiz
92%
Singleton
4%
SharedInstance
2%
OnlyInstance
3%
UniqueInstance
Какие паттерны есть ?
Спросят с вероятностью 55%
Существует множество паттернов проектирования, каждый из которых решает определённую задачу или предлагает эффективный подход к организации кода. Они помогают делать код более читаемым, упрощают рефакторинг и поддержку программы. Паттерны обычно классифицируют на три основных типа: порождающие, структурные и поведенческие.
Порождающие паттерны (Creational Patterns)
Упрощают процесс создания объектов, делая систему независимой от способа создания, компоновки и представления объектов.
✅Одиночка (Singleton): Обеспечивает наличие только одного экземпляра класса и предоставляет к нему глобальный доступ.
✅Фабричный метод (Factory Method): Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемых объектов.
✅Абстрактная фабрика (Abstract Factory): Позволяет создавать семейства связанных или зависимых объектов без указания их конкретных классов.
✅Прототип (Prototype): Позволяет копировать существующие объекты без делания кода зависимым от их классов.
✅Строитель (Builder): Позволяет создавать сложные объекты пошагово, используя один и тот же код для создания различных представлений объектов.
Структурные паттерны (Structural Patterns)
Описывают, как объединять объекты и классы в более крупные структуры.
✅Адаптер (Adapter): Позволяет объектам с несовместимыми интерфейсами работать вместе.
✅Мост (Bridge): Разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя им изменяться независимо друг от друга.
✅Композит (Composite): Позволяет группировать множество объектов в древовидную структуру, и работать с этой структурой так, как будто это единственный объект.
✅Декоратор (Decorator): Позволяет динамически добавлять новые функции объектам, помещая их в объекты-обёртки.
✅Фасад (Facade): Предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.
Поведенческие паттерны (Behavioral Patterns)
Регулируют эффективное взаимодействие и распределение обязанностей между объектами.
✅Наблюдатель (Observer): Позволяет объектам получать уведомления об изменениях в других объектах.
✅Стратегия (Strategy): Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
✅Состояние (State): Позволяет объекту изменять своё поведение в зависимости от его состояния.
✅Команда (Command): Превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить их в очередь, логировать и т.д.
✅Цепочка обязанностей (Chain of Responsibility): Позволяет передавать запросы последовательно по цепочке обработчиков, пока один из них не обработает запрос.
✅Посредник (Mediator): Позволяет уменьшить взаимосвязь между классами, вынося межклассовые взаимодействия в класс-посредник.
✅Итератор (Iterator): Даёт возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления.
Каждый паттерн проектирования решает определённую проблему и может быть полезен в различных ситуациях. Однако важно помнить, что применение паттернов требует умения и понимания конкретной задачи, для которой он может быть использован.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 55%
Существует множество паттернов проектирования, каждый из которых решает определённую задачу или предлагает эффективный подход к организации кода. Они помогают делать код более читаемым, упрощают рефакторинг и поддержку программы. Паттерны обычно классифицируют на три основных типа: порождающие, структурные и поведенческие.
Порождающие паттерны (Creational Patterns)
Упрощают процесс создания объектов, делая систему независимой от способа создания, компоновки и представления объектов.
✅Одиночка (Singleton): Обеспечивает наличие только одного экземпляра класса и предоставляет к нему глобальный доступ.
✅Фабричный метод (Factory Method): Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемых объектов.
✅Абстрактная фабрика (Abstract Factory): Позволяет создавать семейства связанных или зависимых объектов без указания их конкретных классов.
✅Прототип (Prototype): Позволяет копировать существующие объекты без делания кода зависимым от их классов.
✅Строитель (Builder): Позволяет создавать сложные объекты пошагово, используя один и тот же код для создания различных представлений объектов.
Структурные паттерны (Structural Patterns)
Описывают, как объединять объекты и классы в более крупные структуры.
✅Адаптер (Adapter): Позволяет объектам с несовместимыми интерфейсами работать вместе.
✅Мост (Bridge): Разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя им изменяться независимо друг от друга.
✅Композит (Composite): Позволяет группировать множество объектов в древовидную структуру, и работать с этой структурой так, как будто это единственный объект.
✅Декоратор (Decorator): Позволяет динамически добавлять новые функции объектам, помещая их в объекты-обёртки.
✅Фасад (Facade): Предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.
Поведенческие паттерны (Behavioral Patterns)
Регулируют эффективное взаимодействие и распределение обязанностей между объектами.
✅Наблюдатель (Observer): Позволяет объектам получать уведомления об изменениях в других объектах.
✅Стратегия (Strategy): Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
✅Состояние (State): Позволяет объекту изменять своё поведение в зависимости от его состояния.
✅Команда (Command): Превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить их в очередь, логировать и т.д.
✅Цепочка обязанностей (Chain of Responsibility): Позволяет передавать запросы последовательно по цепочке обработчиков, пока один из них не обработает запрос.
✅Посредник (Mediator): Позволяет уменьшить взаимосвязь между классами, вынося межклассовые взаимодействия в класс-посредник.
✅Итератор (Iterator): Даёт возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления.
Каждый паттерн проектирования решает определённую проблему и может быть полезен в различных ситуациях. Однако важно помнить, что применение паттернов требует умения и понимания конкретной задачи, для которой он может быть использован.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤1👍1
Forwarded from Идущий к IT
10$ за техническое собеседование на английском языке:
1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$
🛡 Важно:
– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована
🤝 Условия:
– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$
– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована
– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👾1
Как происходит механизм обработки нажатий ?
Спросят с вероятностью 18%
Механизм обработки нажатий в пользовательских интерфейсах операционных систем и приложений включает в себя несколько ключевых этапов, которые обеспечивают реакцию системы на действия пользователя. Рассмотрим общий процесс на примере смартфонов и десктопных операционных систем:
1️⃣События ввода от устройств
Всё начинается с событий ввода, которые генерируются устройствами ввода, такими как сенсорные экраны, мыши или трекпады. Когда пользователь нажимает на экран или кликает мышью, устройство ввода отправляет сигнал операционной системе о том, что было совершено нажатие.
2️⃣Операционная система и диспетчер окон
Операционная система получает эти сигналы и передаёт их диспетчеру окон или системному обработчику событий. Диспетчер окон определяет, какому приложению или части интерфейса принадлежит область экрана, по которой было совершено нажатие.
3️⃣Передача событий в приложение
После того как определено, что событие нажатия принадлежит определённому приложению, событие передаётся этому приложению. В приложении событие перенаправляется в систему управления событиями внутри самого приложения.
4️⃣Обработка событий в приложении
Внутри приложения событие нажатия перенаправляется к соответствующему компоненту интерфейса (например, кнопке или ссылке), который зарегистрирован для обработки такого типа событий. Каждый элемент управления (или виджет) в пользовательском интерфейсе имеет свой обработчик событий, который определяет, что делать при нажатии на него.
5️⃣Вызов обработчиков событий
Компонент интерфейса вызывает заранее определённый обработчик события (например, функцию обратного вызова или "слушатель" событий), который исполняет код, ассоциированный с этим нажатием. Это может включать изменение внешнего вида элемента, открытие нового окна, отправку данных и т.д.
6️⃣Отклик интерфейса
После обработки события интерфейс может обновиться в ответ на действия пользователя — например, кнопка может изменить свой цвет, чтобы показать, что она была нажата, или может появиться новое окно с дополнительной информацией.
Пример на примере iOS (UIKit):
Процесс обработки нажатий осуществляется с помощью UIResponder цепочки, где события передаются от приложения к текущему активному объекту. Если объект не обрабатывает событие, оно передаётся дальше по цепочке, пока не найдёт подходящий обработчик или не достигнет корня иерархии представлений.
Этот механизм позволяет разработчикам создавать интерактивные, интуитивно понятные интерфейсы, отзывающиеся на различные действия пользователя.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Механизм обработки нажатий в пользовательских интерфейсах операционных систем и приложений включает в себя несколько ключевых этапов, которые обеспечивают реакцию системы на действия пользователя. Рассмотрим общий процесс на примере смартфонов и десктопных операционных систем:
1️⃣События ввода от устройств
Всё начинается с событий ввода, которые генерируются устройствами ввода, такими как сенсорные экраны, мыши или трекпады. Когда пользователь нажимает на экран или кликает мышью, устройство ввода отправляет сигнал операционной системе о том, что было совершено нажатие.
2️⃣Операционная система и диспетчер окон
Операционная система получает эти сигналы и передаёт их диспетчеру окон или системному обработчику событий. Диспетчер окон определяет, какому приложению или части интерфейса принадлежит область экрана, по которой было совершено нажатие.
3️⃣Передача событий в приложение
После того как определено, что событие нажатия принадлежит определённому приложению, событие передаётся этому приложению. В приложении событие перенаправляется в систему управления событиями внутри самого приложения.
4️⃣Обработка событий в приложении
Внутри приложения событие нажатия перенаправляется к соответствующему компоненту интерфейса (например, кнопке или ссылке), который зарегистрирован для обработки такого типа событий. Каждый элемент управления (или виджет) в пользовательском интерфейсе имеет свой обработчик событий, который определяет, что делать при нажатии на него.
5️⃣Вызов обработчиков событий
Компонент интерфейса вызывает заранее определённый обработчик события (например, функцию обратного вызова или "слушатель" событий), который исполняет код, ассоциированный с этим нажатием. Это может включать изменение внешнего вида элемента, открытие нового окна, отправку данных и т.д.
6️⃣Отклик интерфейса
После обработки события интерфейс может обновиться в ответ на действия пользователя — например, кнопка может изменить свой цвет, чтобы показать, что она была нажата, или может появиться новое окно с дополнительной информацией.
Пример на примере iOS (UIKit):
Процесс обработки нажатий осуществляется с помощью UIResponder цепочки, где события передаются от приложения к текущему активному объекту. Если объект не обрабатывает событие, оно передаётся дальше по цепочке, пока не найдёт подходящий обработчик или не достигнет корня иерархии представлений.
@IBAction func buttonTapped(_ sender: UIButton) {
print("Кнопка нажата")
}Этот механизм позволяет разработчикам создавать интерактивные, интуитивно понятные интерфейсы, отзывающиеся на различные действия пользователя.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤1
Anonymous Quiz
6%
Для инициализации переменных.
73%
Для выхода из функций или методов при определенном условии.
1%
Для создания асинхронного кода.
21%
Для обработки ошибок.
Какие есть примитивы в gcd ?
Спросят с вероятностью 18%
Grand Central Dispatch (GCD) предоставляет различные примитивы для управления параллельным выполнением кода в iOS и macOS. Эти примитивы помогают разработчикам эффективно управлять асинхронными задачами, синхронизировать доступ к ресурсам и контролировать поток выполнения программы. Вот основные примитивы, предоставляемые GCD:
1️⃣Dispatch Queues (Очереди)
Это фундаментальный компонент GCD, который управляет выполнением блоков кода (задач). Они бывают двух типов:
✅Serial Queues (Последовательные очереди): Выполняют задачи одну за другой в порядке их добавления.
✅Concurrent Queues (Параллельные очереди): Позволяют нескольким задачам выполняться одновременно, но порядок начала и завершения выполнения может отличаться от порядка добавления задач.
2️⃣Dispatch Groups (Группы)
Позволяют объединять несколько задач в одну группу для координированного управления. Вы можете отслеживать, когда все задачи в группе завершены, что особенно полезно при выполнении нескольких асинхронных операций, завершение которых необходимо отслеживать.
3️⃣Dispatch Work Items (Элементы работы)
Представляет собой блок кода, который может быть добавлен в очередь для выполнения. Элементы работы можно приостанавливать, возобновлять и отменять, что предоставляет дополнительный контроль над выполнением задач.
4️⃣Dispatch Semaphores (Семафоры)
Используются для управления доступом к ограниченному ресурсу. Они позволяют ограничить количество потоков, которые могут одновременно обращаться к этому ресурсу.
5️⃣Dispatch Sources (Источники событий)
Позволяют вам мониторить различные типы системных событий асинхронно. Это могут быть таймеры, файловые дескрипторы, сигналы и другие источники.
6️⃣Dispatch Barriers (Барьеры)
Используются на параллельных очередях для создания точки синхронизации, в которой очередь приостанавливает выполнение своих параллельных задач до тех пор, пока не выполнится задача с барьером.
Каждый из этих примитивов предназначен для решения определённых задач по управлению параллельным выполнением и синхронизации в приложениях, делая многопоточное программирование более доступным и безопасным.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Grand Central Dispatch (GCD) предоставляет различные примитивы для управления параллельным выполнением кода в iOS и macOS. Эти примитивы помогают разработчикам эффективно управлять асинхронными задачами, синхронизировать доступ к ресурсам и контролировать поток выполнения программы. Вот основные примитивы, предоставляемые GCD:
1️⃣Dispatch Queues (Очереди)
Это фундаментальный компонент GCD, который управляет выполнением блоков кода (задач). Они бывают двух типов:
✅Serial Queues (Последовательные очереди): Выполняют задачи одну за другой в порядке их добавления.
✅Concurrent Queues (Параллельные очереди): Позволяют нескольким задачам выполняться одновременно, но порядок начала и завершения выполнения может отличаться от порядка добавления задач.
2️⃣Dispatch Groups (Группы)
Позволяют объединять несколько задач в одну группу для координированного управления. Вы можете отслеживать, когда все задачи в группе завершены, что особенно полезно при выполнении нескольких асинхронных операций, завершение которых необходимо отслеживать.
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
DispatchQueue.global().async {
// Задача 1
dispatchGroup.leave()
}
dispatchGroup.enter()
DispatchQueue.global().async {
// Задача 2
dispatchGroup.leave()
}
dispatchGroup.notify(queue: DispatchQueue.main) {
// Вызывается, когда обе задачи завершены
print("Все задачи в группе выполнены.")
}
3️⃣Dispatch Work Items (Элементы работы)
Представляет собой блок кода, который может быть добавлен в очередь для выполнения. Элементы работы можно приостанавливать, возобновлять и отменять, что предоставляет дополнительный контроль над выполнением задач.
var workItem: DispatchWorkItem?
workItem = DispatchWorkItem {
print("Выполнение задачи")
if workItem?.isCancelled ?? false {
return
}
// Продолжение выполнения
}
DispatchQueue.global().async(execute: workItem!)
4️⃣Dispatch Semaphores (Семафоры)
Используются для управления доступом к ограниченному ресурсу. Они позволяют ограничить количество потоков, которые могут одновременно обращаться к этому ресурсу.
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global().async {
semaphore.wait() // Ожидание сигнала
// Критическая секция
semaphore.signal() // Отправка сигнала
}
5️⃣Dispatch Sources (Источники событий)
Позволяют вам мониторить различные типы системных событий асинхронно. Это могут быть таймеры, файловые дескрипторы, сигналы и другие источники.
6️⃣Dispatch Barriers (Барьеры)
Используются на параллельных очередях для создания точки синхронизации, в которой очередь приостанавливает выполнение своих параллельных задач до тех пор, пока не выполнится задача с барьером.
let queue = DispatchQueue(label: "com.example.queue", attributes: .
concurrent)
queue.async(flags: .barrier) {
// Задача с барьером
}
Каждый из этих примитивов предназначен для решения определённых задач по управлению параллельным выполнением и синхронизации в приложениях, делая многопоточное программирование более доступным и безопасным.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🔥3❤1
Что такое optional chaining в Swift?
Anonymous Quiz
70%
Позволяет выполнять операции только если объект не равен nil.
11%
Используется для обработки ошибок.
13%
Не позволяет переменной быть nil.
6%
Это способ создания замыканий.
Есть ли отличия value тайпа от референса тайпа ?
Спросят с вероятностью 55%
Между типами значений (value types) и ссылочными типами (reference types) существуют существенные отличия, которые влияют на работу с данными.
Основные отличия:
1️⃣Способ хранения:
✅Value types хранятся в стеке, и их значения копируются при передаче. Это значит, что если вы передадите структуру функции или присвоите её новой переменной, создастся новая копия этого значения.
✅Reference types хранятся в куче, а переменные хранят ссылки на эти объекты. При передаче переменной класса, вы передаёте ссылку на один и тот же объект, а не его копию.
2️⃣Примеры:
✅В Swift value types включают структуры (
✅Reference types включают классы (
3️⃣Идентификация:
✅Для value types равенство определяется по содержимому объекта. Два объекта считаются равными, если их содержимое идентично.
✅Для reference types равенство может определяться как равенство по ссылке. Два объекта считаются равными, если они указывают на один и тот же участок памяти.
4️⃣Поведение при передаче данных:
✅Передача value types ведёт к созданию копии. Изменения одной копии не влияют на другую.
✅Передача reference types означает передачу ссылки на тот же объект. Изменения в одном месте отразятся на всех ссылках на этот объект.
5️⃣Использование:
✅Value types обычно используются, когда копирование или независимость данных предпочтительнее. Они обеспечивают более предсказуемое управление памятью, так как Swift автоматически управляет жизненным циклом структур и других типов значений.
✅Reference types полезны, когда необходимо иметь общее состояние или взаимодействовать с объектами, которые могут изменяться в разных частях программы.
✅Value types (типы значений) копируются при передаче и обычно используются для базовых типов данных. Они предоставляют простоту и безопасность при работе с данными.
✅Reference types (ссылочные типы) передаются по ссылке, позволяя разным частям программы взаимодействовать с одним и тем же объектом. Это полезно для работы с комплексными структурами данных и для реализации определённых шаблонов проектирования.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 55%
Между типами значений (value types) и ссылочными типами (reference types) существуют существенные отличия, которые влияют на работу с данными.
Основные отличия:
1️⃣Способ хранения:
✅Value types хранятся в стеке, и их значения копируются при передаче. Это значит, что если вы передадите структуру функции или присвоите её новой переменной, создастся новая копия этого значения.
✅Reference types хранятся в куче, а переменные хранят ссылки на эти объекты. При передаче переменной класса, вы передаёте ссылку на один и тот же объект, а не его копию.
2️⃣Примеры:
✅В Swift value types включают структуры (
struct), перечисления (enum) и базовые типы данных (Int, String, Array, и т.д.).✅Reference types включают классы (
class).3️⃣Идентификация:
✅Для value types равенство определяется по содержимому объекта. Два объекта считаются равными, если их содержимое идентично.
✅Для reference types равенство может определяться как равенство по ссылке. Два объекта считаются равными, если они указывают на один и тот же участок памяти.
4️⃣Поведение при передаче данных:
✅Передача value types ведёт к созданию копии. Изменения одной копии не влияют на другую.
✅Передача reference types означает передачу ссылки на тот же объект. Изменения в одном месте отразятся на всех ссылках на этот объект.
5️⃣Использование:
✅Value types обычно используются, когда копирование или независимость данных предпочтительнее. Они обеспечивают более предсказуемое управление памятью, так как Swift автоматически управляет жизненным циклом структур и других типов значений.
✅Reference types полезны, когда необходимо иметь общее состояние или взаимодействовать с объектами, которые могут изменяться в разных частях программы.
✅Value types (типы значений) копируются при передаче и обычно используются для базовых типов данных. Они предоставляют простоту и безопасность при работе с данными.
✅Reference types (ссылочные типы) передаются по ссылке, позволяя разным частям программы взаимодействовать с одним и тем же объектом. Это полезно для работы с комплексными структурами данных и для реализации определённых шаблонов проектирования.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤4
Какой метод используется для сортировки массива в Swift?
Anonymous Quiz
8%
sortArray()
91%
sorted()
0%
orderArray()
1%
arrange()
Можно сделать так, чтобы отменилась операция во время выполнения в gcd ?
Спросят с вероятностью 18%
В Grand Central Dispatch (GCD) отмена операции не поддерживается напрямую, так как он не предоставляет встроенных механизмов для отмены уже запущенных задач. Однако, вы можете реализовать поддержку отмены операций на уровне вашего приложения, используя кастомные проверки внутри блоков выполнения.
Как реализовать отмену операции
Нужно будет использовать внешнюю переменную или структуру, которая будет отслеживать, нужно ли отменить выполнение задачи. Вот как это можно сделать на практике:
1️⃣Определите переменную для отслеживания состояния отмены.
Вы можете использовать переменную типа
2️⃣Проверяйте эту переменную внутри вашей асинхронной задачи.
В ключевых точках вашей задачи добавьте проверки этой переменной, и, если задача должна быть отменена, корректно завершите выполнение блока.
3️⃣Изменяйте эту переменную из других частей вашего приложения при необходимости отмены.
Это позволит вам контролировать выполнение задачи из любой части приложения.
Пример:
Важные моменты
✅Проверки отмены должны быть распределены равномерно по всему коду задачи, чтобы обеспечить своевременное реагирование на запросы отмены.
✅Безопасность доступа к данным: Убедитесь, что доступ к переменной
Хотя GCD не предоставляет встроенной поддержки отмены задач, вы можете организовать такую поддержку самостоятельно, используя простые проверки состояния в коде своих асинхронных задач.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
В Grand Central Dispatch (GCD) отмена операции не поддерживается напрямую, так как он не предоставляет встроенных механизмов для отмены уже запущенных задач. Однако, вы можете реализовать поддержку отмены операций на уровне вашего приложения, используя кастомные проверки внутри блоков выполнения.
Как реализовать отмену операции
Нужно будет использовать внешнюю переменную или структуру, которая будет отслеживать, нужно ли отменить выполнение задачи. Вот как это можно сделать на практике:
1️⃣Определите переменную для отслеживания состояния отмены.
Вы можете использовать переменную типа
Bool, которая будет указывать, следует ли продолжать выполнение задачи.2️⃣Проверяйте эту переменную внутри вашей асинхронной задачи.
В ключевых точках вашей задачи добавьте проверки этой переменной, и, если задача должна быть отменена, корректно завершите выполнение блока.
3️⃣Изменяйте эту переменную из других частей вашего приложения при необходимости отмены.
Это позволит вам контролировать выполнение задачи из любой части приложения.
Пример:
import Foundation
class TaskHandler {
var isCancelled = false
func performLongRunningTask() {
DispatchQueue.global().async {
for i in 1...10 {
if self.isCancelled {
print("Операция была отменена!")
return
}
sleep(1) // Имитация длительной операции
print("Итерация \(i) завершена")
}
}
}
func cancelTask() {
isCancelled = true
}
}
let taskHandler = TaskHandler()
taskHandler.performLongRunningTask()
// Отменить задачу через 3 секунды
DispatchQueue.global().asyncAfter(deadline: .now() + 3) {
taskHandler.cancelTask()
}
Важные моменты
✅Проверки отмены должны быть распределены равномерно по всему коду задачи, чтобы обеспечить своевременное реагирование на запросы отмены.
✅Безопасность доступа к данным: Убедитесь, что доступ к переменной
isCancelled потокобезопасен, особенно если вы изменяете её из разных потоков. В приведённом примере, так как доступ к переменной осуществляется только из задач, запущенных на глобальной очереди, проблем с потокобезопасностью не возникает.Хотя GCD не предоставляет встроенной поддержки отмены задач, вы можете организовать такую поддержку самостоятельно, используя простые проверки состояния в коде своих асинхронных задач.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Как опциональный тип реализован под капотом ?
Спросят с вероятностью 18%
Опциональный тип (Optional) реализован как перечисление (
Реализация:
Определяет
Это определение показывает, что
Примеры:
Работа с ними:
Предоставляет несколько способов для работы с опциональными значениями:
1️⃣Принудительное извлечение (`force unwrapping`):
Использование
2️⃣Опциональное связывание (`optional binding`):
Это позволяет безопасно извлечь значение, если оно существует.
3️⃣Оператор объединения с nil (`nil coalescing`):
Это позволяет предоставить значение по умолчанию для опционального типа в случае, если он содержит
Особенности:
✅Каждый опциональный тип на самом деле представляет собой один из двух случаев перечисления
✅С точки зрения памяти, опциональный тип потребляет больше ресурсов, чем его неопциональный аналог, потому что он должен хранить дополнительную информацию о том, содержит ли он значение или нет.
✅Компилятор обрабатывает опциональные типы особым образом, в частности, предоставляя специальный синтаксис (
Это базовое понимание того, как опциональные типы реализованы под капотом. Их использование является фундаментальным аспектом безопасной работы с данными, которые могут отсутствовать.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Опциональный тип (Optional) реализован как перечисление (
enum). Это перечисление имеет два случая: .none, который эквивалентен значению nil, и .some(Wrapped), который содержит значение типа Wrapped. Тип Wrapped здесь — это тип данных, который может быть или не быть (то есть может быть опциональным).Реализация:
Определяет
Optional как:enum Optional<Wrapped> {
case none
case some(Wrapped)
}Это определение показывает, что
Optional является универсальным типом с параметром Wrapped. Он может либо содержать значение (some), либо не содержать его вообще (none).Примеры:
var optionalInt: Optional<Int> = .some(5)
var nilInt: Optional<Int> = .none
// Swift предоставляет синтаксический сахар для опциональных типов
var optionalIntSugar: Int? = 5
var nilIntSugar: Int? = nil
Работа с ними:
Предоставляет несколько способов для работы с опциональными значениями:
1️⃣Принудительное извлечение (`force unwrapping`):
let unwrappedInt = optionalIntSugar!
Использование
! для извлечения значения из опционального типа. Это приведет к ошибке времени выполнения, если значение будет nil.2️⃣Опциональное связывание (`optional binding`):
if let unwrappedInt = optionalIntSugar {
print("Значение: \(unwrappedInt)")
} else {
print("Нет значения")
}
Это позволяет безопасно извлечь значение, если оно существует.
3️⃣Оператор объединения с nil (`nil coalescing`):
let number = optionalIntSugar ?? 0
Это позволяет предоставить значение по умолчанию для опционального типа в случае, если он содержит
nil.Особенности:
✅Каждый опциональный тип на самом деле представляет собой один из двух случаев перечисления
Optional.✅С точки зрения памяти, опциональный тип потребляет больше ресурсов, чем его неопциональный аналог, потому что он должен хранить дополнительную информацию о том, содержит ли он значение или нет.
✅Компилятор обрабатывает опциональные типы особым образом, в частности, предоставляя специальный синтаксис (
?) и интегрируя проверки на nil в процесс компиляции.Это базовое понимание того, как опциональные типы реализованы под капотом. Их использование является фундаментальным аспектом безопасной работы с данными, которые могут отсутствовать.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
Для чего используется ключевое слово inout в Swift?
Anonymous Quiz
4%
Для создания асинхронного кода.
85%
Для передачи значений по ссылке.
2%
Для обработки ошибок.
10%
Для создания замыканий.
Какие типы коллекций существуют ?
Спросят с вероятностью 55%
Существует несколько основных типов коллекций, каждый из которых имеет свои уникальные характеристики и предназначен для решения определённых задач. К основным типам коллекций относятся массивы (Arrays), множества (Sets) и словари (Dictionaries).
1️⃣Массивы (Arrays)
Используются для хранения упорядоченных коллекций элементов одного типа. Они могут содержать дубликаты и сохраняют порядок элементов, в котором те были добавлены. Являются типами значений (value types), что означает, что при их передаче происходит копирование данных.
Пример:
Представляют неупорядоченные коллекции уникальных элементов одного типа. Они очень похожи на массивы, но, в отличие от массивов, не сохраняют порядок элементов и не могут содержать дубликаты. Особенно эффективны при проверке на принадлежность, добавлении или удалении элементов.
Пример:
Используются для хранения неупорядоченных коллекций элементов, которые доступны по уникальному ключу. Каждый элемент в словаре является парой "ключ-значение". Ключи словаря должны быть уникальными, а значения могут дублироваться. Они также являются типами значений.
Пример:
✅Массивы хранят упорядоченные коллекции элементов и могут содержать дубликаты. Используются, когда порядок элементов важен.
✅Множества хранят уникальные элементы в неопределённом порядке. Эффективны для проверки на принадлежность и исключения дубликатов.
✅Словари хранят неупорядоченные пары "ключ-значение", доступные по уникальному ключу. Подходят для быстрого доступа к элементам по идентификатору.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 55%
Существует несколько основных типов коллекций, каждый из которых имеет свои уникальные характеристики и предназначен для решения определённых задач. К основным типам коллекций относятся массивы (Arrays), множества (Sets) и словари (Dictionaries).
1️⃣Массивы (Arrays)
Используются для хранения упорядоченных коллекций элементов одного типа. Они могут содержать дубликаты и сохраняют порядок элементов, в котором те были добавлены. Являются типами значений (value types), что означает, что при их передаче происходит копирование данных.
Пример:
var someInts = [Int]()Множества (Sets)
someInts.append(3) // Добавление элемента
someInts = [] // Очистка массива
2️⃣
Представляют неупорядоченные коллекции уникальных элементов одного типа. Они очень похожи на массивы, но, в отличие от массивов, не сохраняют порядок элементов и не могут содержать дубликаты. Особенно эффективны при проверке на принадлежность, добавлении или удалении элементов.
Пример:
var letters = Set<Character>()Словари (Dictionaries)
letters.insert("a") // Добавление элемента
letters = [] // Очистка множества
3️⃣
Используются для хранения неупорядоченных коллекций элементов, которые доступны по уникальному ключу. Каждый элемент в словаре является парой "ключ-значение". Ключи словаря должны быть уникальными, а значения могут дублироваться. Они также являются типами значений.
Пример:
var namesOfIntegers = [Int: String]() // Пустой словарь
namesOfIntegers[16] = "sixteen" // Добавление нового элемента
namesOfIntegers = [:] // Очистка словаря
✅Массивы хранят упорядоченные коллекции элементов и могут содержать дубликаты. Используются, когда порядок элементов важен.
✅Множества хранят уникальные элементы в неопределённом порядке. Эффективны для проверки на принадлежность и исключения дубликатов.
✅Словари хранят неупорядоченные пары "ключ-значение", доступные по уникальному ключу. Подходят для быстрого доступа к элементам по идентификатору.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых