Swift | Вопросы собесов
Ir al canal en Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Mostrar más2 179
Suscriptores
-224 horas
-37 días
-1630 días
Carga de datos en curso...
Canales Similares
Nube de Etiquetas
Menciones Entrantes y Salientes
---
---
---
---
---
---
Atraer Suscriptores
agosto '26
agosto '26
+25
en 0 canales
julio '26
+18
en 0 canales
Get PRO
junio '26
+32
en 1 canales
Get PRO
mayo '26
+21
en 0 canales
Get PRO
abril '26
+23
en 0 canales
Get PRO
marzo '26
+35
en 0 canales
Get PRO
febrero '26
+45
en 1 canales
Get PRO
enero '26
+58
en 0 canales
Get PRO
diciembre '25
+28
en 0 canales
Get PRO
noviembre '25
+156
en 1 canales
Get PRO
octubre '25
+26
en 0 canales
Get PRO
septiembre '25
+41
en 0 canales
Get PRO
agosto '25
+38
en 0 canales
Get PRO
julio '25
+27
en 0 canales
Get PRO
junio '25
+34
en 0 canales
Get PRO
mayo '25
+50
en 0 canales
Get PRO
abril '25
+87
en 0 canales
Get PRO
marzo '25
+151
en 2 canales
Get PRO
febrero '25
+123
en 1 canales
Get PRO
enero '25
+127
en 53 canales
Get PRO
diciembre '24
+55
en 1 canales
Get PRO
noviembre '24
+75
en 0 canales
Get PRO
octubre '24
+193
en 42 canales
Get PRO
septiembre '24
+348
en 251 canales
Get PRO
agosto '24
+98
en 0 canales
Get PRO
julio '24
+140
en 54 canales
Get PRO
junio '24
+411
en 244 canales
Get PRO
mayo '24
+646
en 191 canales
Get PRO
abril '24
+353
en 23 canales
| Fecha | Crecimiento de Suscriptores | Menciones | Canales | |
| 31 agosto | +1 | |||
| 30 agosto | +1 | |||
| 29 agosto | 0 | |||
| 28 agosto | 0 | |||
| 27 agosto | +4 | |||
| 26 agosto | +1 | |||
| 25 agosto | 0 | |||
| 24 agosto | +3 | |||
| 23 agosto | 0 | |||
| 22 agosto | +2 | |||
| 21 agosto | 0 | |||
| 20 agosto | 0 | |||
| 19 agosto | +1 | |||
| 18 agosto | 0 | |||
| 17 agosto | +2 | |||
| 16 agosto | 0 | |||
| 15 agosto | 0 | |||
| 14 agosto | +2 | |||
| 13 agosto | +1 | |||
| 12 agosto | +1 | |||
| 11 agosto | 0 | |||
| 10 agosto | 0 | |||
| 09 agosto | 0 | |||
| 08 agosto | 0 | |||
| 07 agosto | +1 | |||
| 06 agosto | 0 | |||
| 05 agosto | +2 | |||
| 04 agosto | +2 | |||
| 03 agosto | 0 | |||
| 02 agosto | +1 | |||
| 01 agosto | 0 |
Publicaciones del Canal
🤔 На каком этапе работает подсчёт ссылок?
Подсчёт ссылок работает во время исполнения программы, в момент изменения количества strong-ссылок. Увеличивается при присваивании, уменьшается при обнулении или выходе из области видимости.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
| 2 | 🔥 Осталось 3 дня!
Пожизненный easyoffer PRO по цене одного года. Покупаешь один раз – пользуешься всю жизнь.
Что входит в PRO:
– Вопросы и задачи с реальных собеседований в конкретных компаниях
– Лучшие ответы и видео-примеры от middle/senior специалистов
– Записи реальных собеседований
– Обход фильтров ATS с топ-30 ключевых слов в резюме
– Автоотклики на hh
– Тренажёры и симуляторы для идеальной подготовки к интервью
⏳ Акция действует только до 2 сентября 23:59 по МСК
👉 Забрать PRO со скидкой 70%: https://easyoffer.ru/pro | 141 |
| 3 | 🤔 Что относится к типам данных?
Это классификация различных видов данных, которые могут быть использованы и манипулированы в программе. Они определяют, какие операции можно выполнять с данными и как они хранятся в памяти.
🤔 Основные типы данных
🟠Примитивные типы данных
Представляют целые числа. Int, UIn
let age: Int = 25
Представляют дробные числа. Float, Double
let pi: Double = 3.14159
Представляют логические значения true или false. Bool
let isActive: Bool = true
Представляют отдельные символы. Character
let letter: Character = "A"
🟠Составные типы данных (Composite data types)
Представляют последовательности символов. String
let greeting: String = "Hello, World!"
Представляют упорядоченные коллекции элементов одного типа. Array<T>
let numbers: [Int] = [1, 2, 3, 4, 5]
Представляют коллекции пар ключ-значение. Dictionary<Key, Value>
let user: [String: String] = ["name": "Alice", "age": "30"]
Представляют коллекции уникальных элементов. Set<T>
let uniqueNumbers: Set<Int> = [1, 2, 3, 4, 5]
🟠Пользовательские типы данных (User-defined data types)
Представляют тип данных с набором связанных значений. enum
enum CompassPoint {
case north
case south
case east
case west
}
Представляют группы связанных значений. struct
struct Person {
var name: String
var age: Int
}
let person = Person(name: "Alice", age: 30)
Представляют объекты с состоянием и поведением. class
class Car {
var model: String
var year: Int
init(model: String, year: Int) {
self.model = model
self.year = year
}
}
let car = Car(model: "Tesla", year: 2021)
🟠Специальные типы данных
Представляют группы нескольких значений различных типов. (Type1, Type2, ...)
let coordinates: (Int, Int) = (10, 20)
Представляют значение, которое может быть либо некоторым значением, либо nil. Optional<T>
var optionalName: String? = "Alice"
Ставь 👍 и забирай 📚 Базу знаний | 132 |
| 4 | 🤔 Как решить проблему race condition?
Race condition — это ошибка, возникающая при одновременном доступе нескольких потоков к одним и тем же данным без должной синхронизации. Для решения проблемы race condition в Swift используются механизмы синхронизации, такие как блокировки (locks), семафоры или серийные очереди GCD. Эти инструменты позволяют ограничить доступ к общим ресурсам, чтобы только один поток мог их изменять в любой момент времени. Это предотвращает непредсказуемое поведение программы и ошибки при многопоточном доступе к данным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 160 |
| 5 | 🤔 Какой путь проделывает ивент , когда пользователь нажимает на приложение?
Когда пользователь нажимает на иконку приложения на домашнем экране, iOS проходит несколько этапов перед тем, как приложение становится активным.
🚩Разберём путь события подробнее
🟠Пользователь нажимает на иконку (SpringBoard)
iOS-устройства управляются системой SpringBoard – это оболочка, отвечающая за домашний экран, иконки, фоновые процессы.
Когда пользователь тапает на иконку приложения, SpringBoard отправляет событие UIApplicationLaunchOptionsKey в систему.
🟠iOS загружает процесс приложения
Если приложение не запущено:
- iOS создаёт новый процесс и выделяет память.
- Загружаются зависимости (библиотеки, фреймворки).
- Создаётся объект UIApplication.
🟠Вызывается `application(_:didFinishLaunchingWithOptions:)`
Здесь приложение инициализируется и загружается основной UI.
Метод в AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
print("Приложение запущено")
return true
}
Ставь 👍 и забирай 📚 Базу знаний | 184 |
| 6 | 🤔 Счётчик ссылок дошёл до нуля — в какой момент удалим объект?
Как только счётчик ссылок объекта становится равным нулю, ARC немедленно освобождает память. Удаление происходит автоматически в этот момент, и вызывается деинициализатор (deinit), если он реализован.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 181 |
| 7 | 🤔 Что такое gitflow?
В основе Git Flow – несколько веток с разными ролями, чтобы команда могла параллельно разрабатывать новые фичи, исправлять баги и выпускать релизы.
🚩Как работает Git Flow?
🟠Основные ветки (`main` и `develop`)
- main – содержит только стабильные версии.
- develop – основная ветка разработки, в неё вливаются все новые фичи.
🟠Разработка новых фич (feature branches)
- Каждая новая фича создаётся в отдельной ветке feature/*.
- После завершения сливается в develop.
git checkout develop
git checkout -b feature/new-cool-feature
# Разработка...
git checkout develop
git merge feature/new-cool-feature
git branch -d feature/new-cool-feature
🟠Подготовка к релизу (release branches)
- Когда код стабилен, создаётся ветка release/* от develop.
- Здесь можно тестировать и исправлять баги.
- После финального теста сливается в main и develop.
git checkout develop
git checkout -b release/1.0
# Фиксим баги, тестируем...
git checkout main
git merge release/1.0
git tag -a v1.0 -m "Release 1.0"
git checkout develop
git merge release/1.0
git branch -d release/1.0
🟠Горячие фиксы (hotfix branches)
- Если критический баг в main, создаём hotfix/*.
- После исправления вливаем в main и в develop.
git checkout main
git checkout -b hotfix/urgent-bugfix
# Фиксим баг...
git checkout main
git merge hotfix/urgent-bugfix
git checkout develop
git merge hotfix/urgent-bugfix
git branch -d hotfix/urgent-bugfix
Ставь 👍 и забирай 📚 Базу знаний | 193 |
| 8 | 🤔 Какие есть варианты обезопасить работу с историей images?
Обеспечение безопасности работы с историей изображений в iOS-приложениях может включать несколько уровней защиты:
🟠Контроль доступа к изображениям
- Используйте Privacy Settings (NSPhotoLibraryUsageDescription, NSCameraUsageDescription) для контроля доступа к фотоальбому.
- Для ограниченного доступа в iOS 14+ используйте PHPickerViewController.
let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)
if status == .authorized {
// Доступ есть
} else {
// Запросить разрешение
PHPhotoLibrary.requestAuthorization { newStatus in
if newStatus == .authorized {
print("Доступ получен")
}
}
}
🟠Шифрование изображений
- Если изображения сохраняются локально, используйте AES-шифрование.
- Можно хранить ключ в Keychain или использовать Secure Enclave.
import CommonCrypto
func encryptImage(data: Data, key: Data) -> Data? {
var buffer = Data(count: data.count + kCCBlockSizeAES128)
var numBytesEncrypted: size_t = 0
let status = CCCrypt(
CCOperation(kCCEncrypt), CCAlgorithm(kCCAlgorithmAES),
CCOptions(kCCOptionPKCS7Padding), key.bytes, key.count,
nil, data.bytes, data.count, &buffer, buffer.count, &numBytesEncrypted
)
return status == kCCSuccess ? buffer.prefix(numBytesEncrypted) : nil
}
🟠Безопасное хранение изображений
Core Data с Encrypted Store – можно использовать зашифрованные базы данных, такие как SQLCipher.
FileManager + Data Protection – файлы можно хранить в Application Support с флагом .completeFileProtection.
Keychain – если нужно хранить ссылки на изображения или ключи.
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("secure_image.jpg")
try? imageData.write(to: fileURL, options: .completeFileProtection)
🟠Ограничение кеширования изображений
- Если изображение чувствительное, отключите кеширование в URLSession:
let config = URLSessionConfiguration.default
config.urlCache = nil // Отключаем кеш
let session = URLSession(configuration: config)
🟠Защита от утечек в памяти
- Убедитесь, что ссылки на изображения не создают retain cycle.
- Используйте weak ссылки в кэше изображений.
class ImageCache {
private let cache = NSCache<NSString, UIImage>()
func store(image: UIImage, forKey key: String) {
cache.setObject(image, forKey: key as NSString)
}
func retrieve(forKey key: String) -> UIImage? {
return cache.object(forKey: key as NSString)
}
}
🟠Безопасная загрузка изображений (защита от MITM)
- Используйте HTTPS вместо HTTP.
- Включите App Transport Security (ATS) в Info.plist.
- Верифицируйте SSL-сертификаты при загрузке.
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
if let serverTrust = challenge.protectionSpace.serverTrust {
let credential = URLCredential(trust: serverTrust)
completionHandler(.useCredential, credential)
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
Ставь 👍 и забирай 📚 Базу знаний | 166 |
| 9 | 🤔 Что будет, если применить модификатор к View?
SwiftUI создаст новую View с измененными параметрами, не изменяя оригинальный объект. Это позволяет оптимизировать ререндеринг, так как фреймворк пересоздает только измененные элементы.
Благодаря иммутабельности View-дерева, SwiftUI автоматически сравнивает изменения (diffing), обновляя только те части интерфейса, которые изменились. Это делает рендеринг быстрым и эффективным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 169 |
| 10 | 🤔 Перечислите все ленивые (lazy) контейнеры/вью?
В iOS существует несколько ленивых (lazy) контейнеров и вью, которые откладывают создание или загрузку элементов до момента их фактического использования.
🚩`lazy var` (ленивые свойства)
Обычное свойство инициализируется сразу, а lazy – только при первом вызове.
class Example {
lazy var expensiveObject: Data = {
print("Объект создан!")
return Data()
}()
}
let obj = Example()
print("Объект ещё не создан")
_ = obj.expensiveObject // Только теперь создастся
🚩`LazySequence` и `LazyCollection`
Если вы хотите избежать лишних вычислений, можно использовать ленивую последовательность:
let numbers = (1...1000).lazy.map { $0 * 2 } // Не вычисляется сразу!
print(numbers.first!) // Только теперь вычисляется первый элемент
🚩`LazyVStack`, `LazyHStack`, `LazyGrid` (SwiftUI)
В отличие от обычных VStack и HStack, ленивые версии создают элементы только при прокрутке.
ScrollView {
LazyVStack {
ForEach(0..<1000) { index in
Text("Элемент \(index)")
}
}
}
🚩`UITableView` и `UICollectionView` (UIKit)
Они работают по принципу переиспользования ячеек, загружая их только когда нужно.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = "Строка \(indexPath.row)"
return cell
}
Ставь 👍 и забирай 📚 Базу знаний | 193 |
| 11 | 🤔 Что такое static в Swift?
static — ключевое слово, обозначающее, что свойство или метод относится к типу, а не к экземпляру. В классах также используется class для переопределяемых методов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 206 |
| 12 | 🤔 Какие объекты участвуют в зависимостях?
В зависимости от контекста, под "объектами, участвующими в зависимостях" можно понимать различные концепции. В программировании под зависимостями чаще всего подразумеваются связи между объектами или модулями, где один объект зависит от другого для выполнения своих функций.
🚩Объект-зависимый и объект-зависимость
Когда один объект (например, 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
Ставь 👍 и забирай 📚 Базу знаний | 223 |
| 13 | Пожизненный PRO доступ на easyoffer — по цене одного года!
До 2 сентября вы можете купить PRO навсегда.
Покупаешь один раз — пользуешься всю жизнь.
– База вопросов и задач из собеседований
– Примеры видео-ответов на вопросы
– Записи реальных собеседований
– Тренажеры "Проработка вопросов" и "Реальное собеседование"
– Аналитика требований из вакансий
– Автоотклики на вакансии
– Агрегатор вакансий (скоро)
👉 Купить PRO со скидкой 70%: https://easyoffer.ru/pro | 180 |
| 14 | 🤔 Что такое верстка на AutoLayout, а что такое верстка на frame?
- AutoLayout — это система ограничений (constraints), определяющих расположение элементов вне зависимости от размера экрана. Используется при адаптивной, универсальной верстке.
- Frame-верстка — это явное указание координат и размеров каждого элемента. Быстро, но не гибко — плохо масштабируется под разные устройства и ориентации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 204 |
| 15 | 🤔 В каком методе жизненного цикла можно поставить отступы к 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)
}
}
Ставь 👍 и забирай 📚 Базу знаний | 216 |
| 16 | 🤔 Что происходит с классом при компиляции?
При компиляции в Swift класс проходит несколько стадий обработки:
Анализ синтаксиса и семантики – компилятор проверяет код на ошибки.
Генерация промежуточного представления (IR) – создаётся код на уровне LLVM IR.
Оптимизация – Swift применяет различные оптимизации, например, inlining, dead code elimination и другие.
Генерация машинного кода – итоговый код превращается в исполняемый машинный код, специфичный для платформы.
🚩Что конкретно происходит с классом?
В отличие от структур, классы в Swift являются ссылочными типами и хранятся в куче (heap). Это означает, что:
- При создании объекта выделяется память в куче.
- Swift автоматически использует ARC (Automatic Reference Counting) для управления памятью.
- Методы класса могут вызываться через виртуальную таблицу (vtable), если класс использует динамическую диспетчеризацию.
🚩Важные моменты
- Если класс final, компилятор может оптимизировать вызовы методов, убрав динамическую диспетчеризацию.
- Наследование делает вызовы методов менее предсказуемыми (они идут через vtable).
- В отличие от структур, классы не копируются при передаче в функцию, а передаётся ссылка.
class Animal {
var name: String
init(name: String) {
self.name = name
}
func speak() {
print("Some sound")
}
}
final class Dog: Animal {
override func speak() {
print("Woof!")
}
}
let myDog = Dog(name: "Buddy")
myDog.speak()
Ставь 👍 и забирай 📚 Базу знаний | 220 |
| 17 | 🤔 Расскажи про букву D в solid
Принцип инверсии зависимостей (Dependency Inversion Principle, DIP) гласит:
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
🚩Плохой пример (Нарушение DIP)
class MySQLDatabase {
func fetchData() -> String {
return "Данные из MySQL"
}
}
class DataManager {
let database = MySQLDatabase() // Прямая зависимость от MySQL
func getData() -> String {
return database.fetchData()
}
}
🚩Хороший пример (Используем DIP)
Вводим абстракцию (Протокол)
protocol Database {
func fetchData() -> String
}
Реализуем конкретные базы данных
class MySQLDatabase: Database {
func fetchData() -> String {
return "Данные из MySQL"
}
}
class PostgreSQLDatabase: Database {
func fetchData() -> String {
return "Данные из PostgreSQL"
}
}
Используем абстракцию в DataManager
class DataManager {
private let database: Database // Зависимость от абстракции
init(database: Database) {
self.database = database
}
func getData() -> String {
return database.fetchData()
}
}
Использование
let mySQLDataManager = DataManager(database: MySQLDatabase())
print(mySQLDataManager.getData()) // "Данные из MySQL"
let postgreSQLDataManager = DataManager(database: PostgreSQLDatabase())
print(postgreSQLDataManager.getData()) // "Данные из PostgreSQL"
Ставь 👍 и забирай 📚 Базу знаний | 221 |
| 18 | 🤔 Почему по дефолту дабл, а не фолт?
В 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
Ставь 👍 и забирай 📚 Базу знаний | 215 |
| 19 | 🤔 Чем отличается garbage collector и подсчет ссылок?
Garbage Collector (GC) и Automatic Reference Counting (ARC) – это два разных подхода к управлению памятью в программировании. Они решают одну задачу: автоматическое освобождение неиспользуемой памяти, но делают это по-разному.
🚩Garbage Collector (GC)
Java, Kotlin, C#, Python, JavaScript
- GC периодически просматривает всю память приложения и ищет объекты, на которые больше нет ссылок.
- Когда такие объекты находятся, они удаляются, а память освобождается.
- Это автоматический процесс, который запускается по мере необходимости.
🚩Подсчет ссылок (ARC - Automatic Reference Counting)
Где используется: Swift, Objective-C
- Каждый объект имеет счетчик ссылок (reference count).
- Когда переменная создает ссылку на объект, счетчик увеличивается.
- Когда переменная перестает ссылаться на объект, счетчик уменьшается.
- Когда счетчик достигает нуля, объект удаляется из памяти сразу же.
class Person {
var pet: Pet?
}
class Pet {
var owner: Person?
}
let person = Person()
let pet = Pet()
person.pet = pet
pet.owner = person // Теперь оба объекта держат друг друга, и ARC их не удалит
Решение – использовать weak:
class Pet {
weak var owner: Person? // Теперь утечки памяти не будет
}
Ставь 👍 и забирай 📚 Базу знаний | 225 |
| 20 | 🤔 Класс open — финальный или нефинальный?
open — всегда нефинальный, то есть разрешает наследование и переопределение. Противоположностью является final, который запрещает всё это.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 226 |
