en
Feedback
Swift | Вопросы собесов

Swift | Вопросы собесов

Open in Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

Show more
2 171
Subscribers
-224 hours
-177 days
-2130 days
Attracting Subscribers
September '26
September '260
in 0 channels
August '26
+25
in 0 channels
Get PRO
July '26
+18
in 0 channels
Get PRO
June '26
+32
in 1 channels
Get PRO
May '26
+21
in 0 channels
Get PRO
April '26
+23
in 0 channels
Get PRO
March '26
+35
in 0 channels
Get PRO
February '26
+45
in 1 channels
Get PRO
January '26
+58
in 0 channels
Get PRO
December '25
+28
in 0 channels
Get PRO
November '25
+156
in 1 channels
Get PRO
October '25
+26
in 0 channels
Get PRO
September '25
+41
in 0 channels
Get PRO
August '25
+38
in 0 channels
Get PRO
July '25
+27
in 0 channels
Get PRO
June '25
+34
in 0 channels
Get PRO
May '25
+50
in 0 channels
Get PRO
April '25
+87
in 0 channels
Get PRO
March '25
+151
in 2 channels
Get PRO
February '25
+123
in 1 channels
Get PRO
January '25
+127
in 53 channels
Get PRO
December '24
+55
in 1 channels
Get PRO
November '24
+75
in 0 channels
Get PRO
October '24
+193
in 42 channels
Get PRO
September '24
+348
in 251 channels
Get PRO
August '24
+98
in 0 channels
Get PRO
July '24
+140
in 54 channels
Get PRO
June '24
+411
in 244 channels
Get PRO
May '24
+646
in 191 channels
Get PRO
April '24
+353
in 23 channels
Date
Subscriber Growth
Mentions
Channels
04 September0
03 September0
02 September0
01 September0
Channel Posts
🤔 В чем проблема, если все переменные будут делаться в вик? Если все переменные в коде сделать weak, объекты могут мгновенно удаляться из памяти, потому что никто не будет владеть ими (strong reference). 🚩Как работает `weak`? - weak создает слабую ссылку – объект не увеличивает счетчик ссылок (retain count). - Если нет других (strong) ссылок на объект, он удаляется (ARC освобождает память). - weak переменные всегда являются Optional, потому что объект может стать nil в любой момент.
class Person {
    weak var name: String? // ❌ Ошибка! Строки – это value type, weak нельзя
}
Проблема, если weak используется везде
class Car {
    weak var model: String? // ❌ Ошибка (value type)
    weak var owner: Person? // ⚠️ Будет nil, если нет других strong ссылок
}

class Person {
    var car: Car?
}

var person: Person? = Person()
person?.car = Car()
person?.car?.owner = person // ❌ `owner` - weak, объект сразу удалится

print(person?.car?.owner) // nil, объект Person уничтожен
🚩Когда `weak` полезен? 🟠Избегание циклов ссылок (retain cycle) Например, между delegate и ViewController
   protocol SomeDelegate: AnyObject {
       func doSomething()
   }

   class ViewController {
       weak var delegate: SomeDelegate? // ✅ Prevent retain cycle
   }
🟠Когда объект не должен владеть другим объектом Например, ячейки в UITableView не должны владеть ViewController. Ставь 👍 и забирай 📚 Базу знаний

2
🤔 Каким методом можно запустить анимацию? Обычно используется UIView.animate(withDuration:). Для более тонкой настройки применяются UIViewPropertyAnimator или CoreAnimation (CABasicAnimation, CAKeyframeAnimation). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
150
3
🤔 Как сравниваются значения в dictionary? В Swift словарь (`Dictionary<Key, Value>`) – это неупорядоченная коллекция пар `ключ → значение`, где ключи уникальны. 🟠Сравнение двух словарей (`==`) Swift позволяет сравнивать два словаря по их ключам и значениям, если и ключи, и значения соответствуют протоколу Equatable. let dict1 = ["name": "Alice", "age": "25"] let dict2 = ["name": "Alice", "age": "25"] let dict3 = ["name": "Bob", "age": "30"] print(dict1 == dict2) // ✅ true (значения одинаковые) print(dict1 == dict3) // ❌ false (разные значения) Ошибка при сравнении Dictionary без Equatable Если значения не соответствуют `Equatable`, сравнение не сработает: struct User { let name: String } let dict1 = ["user": User(name: "Alice")] let dict2 = ["user": User(name: "Alice")] // Ошибка: Type 'User' does not conform to protocol 'Equatable' // print(dict1 == dict2) Решение: Сделать User Equatable: struct User: Equatable { let name: String } print(dict1 == dict2) // Теперь работает! 🟠Поиск и сравнение отдельных значений Можно сравнивать отдельные элементы по ключу. let dict = ["name": "Alice", "age": "25"] if dict["name"] == "Alice" { print("Имя совпадает") // ✅ } 🟠Сравнение по ключам (`keys`) и значениям (`values`) Можно сравнить только ключи или только значения. let dict1 = ["name": "Alice", "age": "25"] let dict2 = ["age": "30", "name": "Alice"] print(dict1.keys == dict2.keys) // ✅ true (ключи одинаковые) Сравнение значений print(Set(dict1.values) == Set(dict2.values)) // ✅ true (если порядок неважен) 🟠Сравнение словарей с разными типами (`Any`) Если словарь хранит Any, то прямое сравнение не сработает, и нужно сравнивать элементы вручную. let dict1: [String: Any] = ["name": "Alice", "age": 25] let dict2: [String: Any] = ["name": "Alice", "age": 25] // Функция сравнения словарей с `Any` func areDictionariesEqual(_ dict1: [String: Any], _ dict2: [String: Any]) -> Bool { return NSDictionary(dictionary: dict1).isEqual(to: dict2) } print(areDictionariesEqual(dict1, dict2)) // ✅ true Ставь 👍 и забирай 📚 Базу знаний
163
4
🚨60 минут Пожизненный PRO-доступ на easyoffer (подготовка к IT-собесам + поиск оффера) по цене одного года закрывается прямо сейчас. Один платёж — доступ навсегда. Последнее напоминание 👇 👉 https://easyoffer.ru/pro
32
5
⚠️ 3 часа до конца акции. Последний шанс забрать пожизненный PRO на easyoffer по цене одного года. Это полный доступ к подготовке к собесам и инструментам поиска работы (вопросы с реальных интервью, ответы сеньоров, автоотклики, тренажёры) — один раз и навсегда, вместо ежегодной оплаты. В полночь цена возвращается к обычной. 👉 https://easyoffer.ru/pro
65
6
🤔 Назовите property wrapper, которые объявляют reference семантику? Reference (объектное поведение, ссылочный тип): - @ObservedObject - @StateObject - @EnvironmentObject - @Published - @Model (внутри SwiftData — работает с объектами) Они наблюдают за изменениями в объектных классах и позволяют отслеживать состояние. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
181
7
🤔 Зачем нужны слабые ссылки? Слабые ссылки (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 в любой момент, поэтому требуется дополнительная проверка. ➖Понимание жизненного цикла объектов Требуется хорошее понимание жизненного цикла объектов и управления памятью, чтобы правильно использовать слабые ссылки. Ставь 👍 и забирай 📚 Базу знаний
172
8
⏳ Ребята, сегодня заканчивается акция, о которой стоит знать, если вы в поиске работы или планируете сменить её в ближайший год. easyoffer — это платформа для подготовки к IT-собесам и поиска оффера. Внутри: – база реальных вопросов и live-coding задач с собесов (с частотой их встречаемости) – эталонные ответы от Senior-разработчиков – 1100+ записей настоящих интервью (Сбер, Яндекс, Авито, WB, OZON, МТС) – автоотклики на hh, генератор резюме под вакансию, тренажёры собеседований Сегодня пожизненный PRO-доступ продаётся по цене одного года — платишь один раз и пользуешься всем этим всю жизнь, включая будущие фичи. С завтрашнего дня — только обычная годовая подписка. 👉 https://easyoffer.ru/pro
138
9
🤔 Как заставить оператор поддерживать функцию типа t? В Swift можно заставить оператор поддерживать функцию типа T с помощью перегрузки операторов. Это особенно полезно, когда мы хотим, чтобы оператор мог работать с пользовательскими типами или функциями. 🟠Что значит "функция типа T"? Функция в Swift — это тоже тип данных. func add(_ a: Int, _ b: Int) -> Int { return a + b } Тип этой функции (Int, Int) -> Int 🟠Пример: оператор `+` для функций Допустим, у нас есть две функции, и мы хотим, чтобы оператор + создавал новую функцию, объединяя их поведение. import Foundation // Функция типа (Int) -> Int func double(_ x: Int) -> Int { return x * 2 } func increment(_ x: Int) -> Int { return x + 1 } // Перегружаем оператор + для функций (Int) -> Int func + (lhs: @escaping (Int) -> Int, rhs: @escaping (Int) -> Int) -> (Int) -> Int { return { x in rhs(lhs(x)) } // Сначала вызываем первую, затем вторую } // Используем оператор let combinedFunction = double + increment print(combinedFunction(3)) // (3 * 2) + 1 = 7 🟠Пример: оператор `*` для функций Можно сделать оператор *, который применяет функцию несколько раз. // Перегружаем оператор * для дублирования применения функции func * (lhs: @escaping (Int) -> Int, rhs: Int) -> (Int) -> Int { return { x in var result = x for _ in 0..<rhs { result = lhs(result) } return result } } // Используем оператор let tripleDouble = double * 3 print(tripleDouble(2)) // (2 * 2) * 2 * 2 = 16 Ставь 👍 и забирай 📚 Базу знаний
172
10
Пожизненный PRO — по цене одного года. Покупаешь один раз — пользуешься всю жизнь: 👉 https://easyoffer.ru/pro 🚀 PRO-доступ закроет 99% проблем на пути к офферу: 1. 1100+ записей реальных собеседований (включая топы: Сбер, Авито, Яндекс, WB, OZON, МТС). Видите всё изнутри: как спрашивают, как отвечают сильные кандидаты и на каких ошибках проваливаются 80%. 2. База live-coding задач и вопросов с реальных собесов — с уникальной системой вероятности их встречи. Готовитесь не вслепую, а точечно по темам, которые спрашивают чаще всего. 3. Эталонные ответы от Senior-разработчиков. Никакой воды и догадок — только чёткие структурированные решения, за которые дают «зелёный свет» к офферу. 4. Полный доступ ко всем грейдам и профессиям. Junior вы или Senior, тестировщик, разработчик или проджект — вы получаете ВСЕ материалы easyoffer без ограничений. Безлимитно, Все, Навсегда. 5. База 400+ тестовых заданий. Прокачивайте навыки на реальных задачах — тех самых, что дают перед собесом. 6. Автоотклики на hh.ru — пока вы спите, резюме уходит рекрутерам автоматически. Экономия сотен часов ручного кликанья. 7. Аналитика ТОП-требований из вакансий. Парсим рынок и показываем, какие скиллы сейчас в цене. Апгрейдите резюме точечно и проходите ATS-фильтры (они отсеивают до 75% резюме ещё до рекрутера). 8. Генератор резюме и CV под каждую вакансию. Забудьте про «универсальное» резюме — нейросеть адаптирует ваш опыт под конкретную позицию за минуту и повышает шансы на приглашение в разы. 9. Тренажёры подготовки к собеседованию: «Реальное собеседование» — сценарий вопросов из настоящих интервью. «Проработка вопросов» — флеш-карточки по методике интервальных повторений (как Anki) 10. 🔥 Самое важное: все будущие фичи Вы платите один раз, а продукт растёт всю жизнь. Каждое обновление, каждый новый инструмент, каждая фича, которая появится за все годы проекта, автоматически падает вам в подписку без доплат. Вы фиксируете цену года, а получаете продукт, который через пару лет будет стоить в разы дороже ⭐️ Это уникальная акция пока сайт в режиме Beta. Успей ей воспользоваться⏳ Завтра последний день. 👉 https://easyoffer.ru/pro
135
11
🤔 На каком этапе работает подсчёт ссылок? Подсчёт ссылок работает во время исполнения программы, в момент изменения количества strong-ссылок. Увеличивается при присваивании, уменьшается при обнулении или выходе из области видимости. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
192
12
🔥 Осталось 3 дня! Пожизненный easyoffer PRO по цене одного года. Покупаешь один раз – пользуешься всю жизнь. Что входит в PRO: – Вопросы и задачи с реальных собеседований в конкретных компаниях – Лучшие ответы и видео-примеры от middle/senior специалистов – Записи реальных собеседований – Обход фильтров ATS с топ-30 ключевых слов в резюме – Автоотклики на hh – Тренажёры и симуляторы для идеальной подготовки к интервью ⏳ Акция действует только до 2 сентября 23:59 по МСК 👉 Забрать PRO со скидкой 70%: https://easyoffer.ru/pro
172
13
🤔 Что относится к типам данных? Это классификация различных видов данных, которые могут быть использованы и манипулированы в программе. Они определяют, какие операции можно выполнять с данными и как они хранятся в памяти. 🤔 Основные типы данных 🟠Примитивные типы данных Представляют целые числа. 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" Ставь 👍 и забирай 📚 Базу знаний
186
14
🤔 Как решить проблему race condition? Race condition — это ошибка, возникающая при одновременном доступе нескольких потоков к одним и тем же данным без должной синхронизации. Для решения проблемы race condition в Swift используются механизмы синхронизации, такие как блокировки (locks), семафоры или серийные очереди GCD. Эти инструменты позволяют ограничить доступ к общим ресурсам, чтобы только один поток мог их изменять в любой момент времени. Это предотвращает непредсказуемое поведение программы и ошибки при многопоточном доступе к данным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
192
15
🤔 Какой путь проделывает ивент , когда пользователь нажимает на приложение? Когда пользователь нажимает на иконку приложения на домашнем экране, 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 } Ставь 👍 и забирай 📚 Базу знаний
214
16
🤔 Счётчик ссылок дошёл до нуля — в какой момент удалим объект? Как только счётчик ссылок объекта становится равным нулю, ARC немедленно освобождает память. Удаление происходит автоматически в этот момент, и вызывается деинициализатор (deinit), если он реализован. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
204
17
🤔 Что такое 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 Ставь 👍 и забирай 📚 Базу знаний
210
18
🤔 Какие есть варианты обезопасить работу с историей 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) } } Ставь 👍 и забирай 📚 Базу знаний
183
19
🤔 Что будет, если применить модификатор к View? SwiftUI создаст новую View с измененными параметрами, не изменяя оригинальный объект. Это позволяет оптимизировать ререндеринг, так как фреймворк пересоздает только измененные элементы. Благодаря иммутабельности View-дерева, SwiftUI автоматически сравнивает изменения (diffing), обновляя только те части интерфейса, которые изменились. Это делает рендеринг быстрым и эффективным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
188
20
🤔 Перечислите все ленивые (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 } Ставь 👍 и забирай 📚 Базу знаний
219