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

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

Ir al canal en Telegram

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

Mostrar más
2 200
Suscriptores
-224 horas
-67 días
-1130 días
Atraer Suscriptores
julio '26
julio '26
+3
en 0 canales
junio '26
+32
en 0 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
08 julio0
07 julio0
06 julio0
05 julio0
04 julio0
03 julio0
02 julio+3
01 julio0
Publicaciones del Canal
🤔 Как будешь исправлять краш на пришедшей строке? Сначала нужно проверить формат данных и убедиться, что строка — валидна: - использовать безопасное преобразование типов (if let, guard), - обрабатывать nil, - логировать ошибку и возвращать default-значение или показывать пользователю ошибку. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

2
🤔 Как работают push нотификации? Это сообщения, которые отправляются приложением пользователю даже тогда, когда само приложение не активно. Это эффективный способ удержания пользователей и предоставления им важной информации. 🚩Как работают push-уведомления 1⃣Регистрация устройства Когда приложение устанавливается и запускается на устройстве, оно регистрируется для получения push-уведомлений. Для этого приложение отправляет запрос к Apple Push Notification Service (APNs) с запросом на получение уникального токена устройства (device token). 2⃣Получение токена устройства APNs генерирует уникальный токен для устройства и отправляет его обратно приложению. Приложение затем передает этот токен на свой сервер. 3⃣Отправка уведомления на сервер Когда необходимо отправить push-уведомление, сервер приложения формирует сообщение, включающее содержимое уведомления и токен устройства, и отправляет его на APNs. 4⃣Доставка уведомления APNs принимает сообщение от сервера, определяет устройство по токену и отправляет уведомление на это устройство. 5⃣Получение уведомления на устройстве Когда устройство получает уведомление, операционная система отображает его пользователю. Если пользователь взаимодействует с уведомлением, приложение может выполнить определенные действия, такие как открытие конкретного экрана. 🚩Пример кода для регистрации устройства В AppDelegate import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Запрос разрешения на отправку уведомлений UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in if granted { DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } } return true } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // Преобразуем токен в строку let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) } let token = tokenParts.joined() print("Device Token: \(token)") // Отправляем токен на сервер // serverAPI.registerDeviceToken(token) } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { print("Failed to register: \(error)") } } Ставь 👍 и забирай 📚 Базу знаний
160
3
🤔 Какой самый яркий пример deadlock'а в iOS? Классический deadlock Если вызвать DispatchQueue.main.sync из UI-потока (main) — поток заблокируется сам на себе, вызывая мертвую блокировку. Такое случается при неправильной организации доступа к данным из UI. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
207
4
🤔 Что относится к типам данных? Это классификация различных видов данных, которые могут быть использованы и манипулированы в программе. Они определяют, какие операции можно выполнять с данными и как они хранятся в памяти. 🤔 Основные типы данных 🟠Примитивные типы данных Представляют целые числа. 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" Ставь 👍 и забирай 📚 Базу знаний
214
5
🤔 Какие типы CALayer есть? Среди основных типов: - CALayer — базовый слой. - CAShapeLayer — для отрисовки векторной графики. - CATextLayer — для отображения текста. - CAGradientLayer — для градиентов. - CAReplicatorLayer — для повторяющихся узоров. - CATransformLayer — для 3D-трансформаций. - CAEAGLLayer — для работы с OpenGL. Каждый тип предоставляет свои возможности визуализации и анимации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
203
6
🤔 Какие знаешь способы внедрения зависимостей? Внедрение зависимостей (Dependency Injection, DI) в iOS-приложениях позволяет сделать код более модульным, тестируемым и поддерживаемым. Рассмотрим основные способы внедрения зависимостей в Swift. 🟠Внедрение через инициализатор (Initializer Injection) Это самый распространенный и рекомендуемый способ. Зависимости передаются в объект через его инициализатор. protocol NetworkServiceProtocol { func fetchData() } class NetworkService: NetworkServiceProtocol { func fetchData() { print("Данные загружены") } } // Класс, которому нужна зависимость class ViewModel { private let networkService: NetworkServiceProtocol init(networkService: NetworkServiceProtocol) { self.networkService = networkService } func loadData() { networkService.fetchData() } } // Использование let networkService = NetworkService() let viewModel = ViewModel(networkService: networkService) viewModel.loadData() 🟠Внедрение через свойства (Property Injection) Зависимость передается через свойство класса. class ViewModel { var networkService: NetworkServiceProtocol? func loadData() { networkService?.fetchData() } } // Использование let viewModel = ViewModel() viewModel.networkService = NetworkService() viewModel.loadData() 🟠Внедрение через метод (Method Injection) Зависимость передается непосредственно в метод, который её использует. class ViewModel { func loadData(with networkService: NetworkServiceProtocol) { networkService.fetchData() } } // Использование let viewModel = ViewModel() let networkService = NetworkService() viewModel.loadData(with: networkService) 🟠Использование Service Locator (Антипаттерн) Класс сам запрашивает зависимость у глобального локатора. class ServiceLocator { static let shared = ServiceLocator() private var services: [String: Any] = [:] func register<T>(_ service: T) { let key = String(describing: T.self) services[key] = service } func resolve<T>() -> T? { let key = String(describing: T.self) return services[key] as? T } } // Регистрация зависимостей let locator = ServiceLocator.shared locator.register(NetworkService() as NetworkServiceProtocol) // Использование class ViewModel { func loadData() { let networkService: NetworkServiceProtocol? = ServiceLocator.shared.resolve() networkService?.fetchData() } } 🟠Использование DI-контейнеров (например, Swinject) Специальные библиотеки помогают управлять зависимостями. import Swinject let container = Container() container.register(NetworkServiceProtocol.self) { _ in NetworkService() } class ViewModel { private let networkService: NetworkServiceProtocol init(networkService: NetworkServiceProtocol) { self.networkService = networkService } func loadData() { networkService.fetchData() } } // Разрешение зависимости через контейнер let networkService = container.resolve(NetworkServiceProtocol.self)! let viewModel = ViewModel(networkService: networkService) viewModel.loadData() Ставь 👍 и забирай 📚 Базу знаний
223
7
🤔 Что такое Pod? Pod — это библиотека или фреймворк, подключаемый через CocoaPods, менеджер зависимостей в iOS. Он автоматически загружает, компилирует и подключает сторонние библиотеки к проекту. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
236
8
🤔 Расскажи про букву 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" Ставь 👍 и забирай 📚 Базу знаний
248
9
🤔 Как ловил утечки памяти? Для выявления утечек памяти используют инструмент Instruments, а именно его компонент Leaks, который помогает обнаружить утечки во время выполнения приложения. Важно избегать циклических ссылок, особенно при работе с замыканиями и объектами — для этого применяются слабые (weak) и несобственные (unowned) ссылки, что позволяет сборщику мусора корректно освобождать память. Анализ профилей памяти и использование метода deinit для проверки освобождения объектов также помогает обнаруживать утечки на ранних стадиях. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
217
10
🤔 Что такое 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 Ставь 👍 и забирай 📚 Базу знаний
232
11
🤔 Какие есть структуры данных? 1. Линейные: массивы, списки, стеки, очереди. 2. Нелинейные: деревья, графы. 3. Ассоциативные: хэш-таблицы, словари. 4. Специализированные: кучи, множества. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
208
12
🤔 Какие плюсы и минусы layout'а? Каждый способ создания макетов (layout'а) в iOS-разработке имеет свои преимущества и недостатки. 🚩Interface Builder (IB) ➕Визуальное редактирование Удобный графический интерфейс для быстрой настройки и визуального просмотра изменений. ➕Интеграция с Auto Layout Простая настройка ограничений (constraints) для адаптивного интерфейса. ➕Быстрое прототипирование Возможность быстрого создания и изменения макетов без написания кода. ➖Меньшая гибкость Ограниченные возможности для создания сложных и динамических макетов. ➖Конфликты при совместной работе Трудности при слиянии изменений в storyboard или xib файлах в больших командах. ➖Производительность Более медленное время загрузки по сравнению с программными подходами. 🚩Auto Layout ➕Адаптивность Поддержка различных устройств и ориентаций экрана. ➕Мощные инструменты Возможность создания сложных и адаптивных макетов с помощью ограничений. ➕Интеграция с Interface Builder Упрощенная настройка ограничений через визуальный интерфейс. ➖Крутая кривая обучения Может быть сложно освоить, особенно для новичков. ➖Управление сложными макетами Требует тщательного планирования и может стать сложным при работе с большим количеством ограничений. 🚩Programmatic Layout ➕Полный контроль Возможность точной настройки макета с помощью кода. ➕Гибкость Легкость создания динамических и условных макетов. ➕Управление версиями Легче управлять изменениями в коде по сравнению с визуальными файлами. ➖Большая трудоемкость Требует больше времени и усилий для настройки, особенно для сложных макетов. ➖Меньшая наглядность Отсутствие визуального редактора может затруднить представление конечного результата. 🚩Stack Views ➕Упрощение макетов Легкость создания и управления сложными макетами с минимальными усилиями. ➕Интеграция с Auto Layout Автоматическое управление ограничениями для вложенных элементов. ➕Адаптивность Поддержка различных ориентаций и размеров экранов. ➖Ограниченная гибкость Менее гибкие по сравнению с чистым Auto Layout или программными подходами. ➖Поддержка Не всегда подходят для всех типов макетов, особенно для более сложных компоновок. 🚩SwiftUI ➕Декларативный синтаксис Простота и понятность кода благодаря декларативному подходу. ➕Превью в реальном времени Мгновенное обновление интерфейса при изменении кода. ➕Интеграция с Swift Современные возможности языка и тесная интеграция с экосистемой Apple. ➕Кроссплатформенность Поддержка различных платформ (iOS, macOS, watchOS, tvOS). ➖Требования к версии iOS Поддержка только iOS 13 и выше, что может ограничить использование на старых устройствах. ➖Зрелость фреймворка Некоторые функции еще находятся в стадии разработки, и могут быть ограничены возможности по сравнению с UIKit. Ставь 👍 и забирай 📚 Базу знаний
225
13
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» стал главным каналом для т
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» стал главным каналом для тех, кто использует нейросети на уровне разработки, автоматизации и опенсорса, а не просто балуется в чатах. Здесь собирают только то, что реально экономит человеко-часы и работает в проде. 🎓 Готовые ИИ-сервисы, промпты и ИИ-агенты для автоматизации рутины 📚 Разборы полезных ИИ-инструментов, локальных LLM и опенсорс-репозиториев 🛠 Практические кейсы, гайды по деплою моделей и интеграции ИИ в пайплайны ⚡️ Технические ИТ-новости без маркетинговой воды и душных отчетов Обучение и прокачка в реальном времени: работа с API (Claude, GPT), локалки (Ollama, vLLM), автоматизация кода, опенсорс-утилиты, AI-агенты и др. Ценишь время и работаешь с ИИ, подпишись: @clucai
184
14
🤔 Когда создаётся экземпляр view? Когда происходит первый доступ к view, или когда вызывается метод loadView(). Тогда UIViewController инициализирует дерево вью Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
211
15
🤔 Какие проблемы можно получить , если оставить контекст? Если оставить контекст в замыкании, не принимая во внимание возможные проблемы, это может привести к нескольким серьезным проблемам, особенно в многопоточном и асинхронном программировании. 🚩Проблемы 🟠Утечки памяти (Retain Cycles) Одной из самых распространенных проблем является утечка памяти из-за циклов удержания (retain cycles). Это происходит, когда два или более объекта удерживают ссылки друг на друга, препятствуя освобождению памяти. В этом примере closure захватывает self, что создает цикл удержания: MyClass держит сильную ссылку на closure, а closure держит сильную ссылку на self. class MyClass { var value: Int = 0 var closure: (() -> Void)? func setupClosure() { closure = { self.value += 1 } } } let instance = MyClass() instance.setupClosure() 🟠Непредсказуемое поведение и условия гонки (Race Conditions) Когда замыкания захватывают изменяемый контекст, это может привести к условиям гонки и непредсказуемому поведению, особенно при работе в многопоточном окружении. Если метод increment вызывается из разных потоков, это может привести к условиям гонки и некорректному изменению значения count. class Counter { var count = 0 func increment() { DispatchQueue.global().async { self.count += 1 } } } let counter = Counter() counter.increment() 🟠Задержки в освобождении ресурсов Если замыкания захватывают тяжелые ресурсы (например, файлы, сети), это может привести к задержкам в их освобождении, что может негативно сказаться на производительности приложения. Если FileHandler освобождается, но замыкание все еще захватывает file, это может привести к задержке в освобождении файлового дескриптора. class FileHandler { var file: File? func processFile() { DispatchQueue.global().async { self.file?.read() } } } 🟠Потеря захваченных данных Когда используется слабая ссылка (weak), замыкание может обнаружить, что захваченный объект освобожден, что приводит к тому, что слабая ссылка становится nil. Это требует дополнительных проверок и обработки. class MyClass { var value: Int = 0 var closure: (() -> Void)? func setupClosure() { closure = { [weak self] in guard let strongSelf = self else { return } strongSelf.value += 1 } } } Ставь 👍 и забирай 📚 Базу знаний
253
16
🤔 Какие есть способы внедрения зависимостей? Через инициализацию (constructor injection), сеттеры, property injection, либо через DI-контейнер (например, Swinject, Resolver или Hilt в Android). В iOS чаще используют первый и третий способ. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
240
17
🤔 Что такое runLoop? RunLoop — это фундаментальный механизм в iOS и macOS, который управляет циклом обработки событий в приложении. Он отслеживает и обрабатывает входящие события, такие как нажатия клавиш, касания экрана, таймеры и сетевые запросы, и поддерживает приложение в активном состоянии, пока оно не завершится. 🚩Основные аспекты `RunLoop` 🟠Цикл обработки событий RunLoop постоянно выполняет цикл, ожидая входящие события и обрабатывая их по мере поступления. Этот цикл состоит из нескольких этапов: ожидание события, обработка события и повтор цикла. 🟠Режимы (Modes) RunLoop может работать в разных режимах, которые определяют, какие источники событий будут отслеживаться и обрабатываться. Основные режимы включают default и tracking (для событий отслеживания, таких как прокрутка). В каждой итерации RunLoop обрабатывает события только для текущего режима. RunLoop.current.run(mode: .default, before: Date.distantFuture) 🟠Источники событий (Event Sources) RunLoop может отслеживать различные источники событий, такие как таймеры (Timer), порты (Port), ввод пользователей (такие как касания экрана и клики мыши), а также пользовательские источники (Input Source). 🟠Таймеры RunLoop может управлять таймерами, которые выполняют задачи через определенные интервалы времени. let timer = Timer(timeInterval: 1.0, repeats: true) { _ in print("Timer fired!") } RunLoop.current.add(timer, forMode: .default) 🟠Обработка событий RunLoop используется для обработки событий в основном потоке (main thread) приложения. Это особенно важно для поддержания отзывчивости пользовательского интерфейса, поскольку все взаимодействия с UI происходят в основном потоке. 🚩Пример использования `RunLoop` import Foundation class Example { var timer: Timer? func startRunLoop() { timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true) RunLoop.current.run() } @objc func timerFired() { print("Timer fired!") } } let example = Example() example.startRunLoop() Ставь 👍 и забирай 📚 Базу знаний
262
18
🤔 В чем разница между синхронными и асинхронными запросами? Синхронные запросы блокируют выполнение программы до получения ответа, что может замедлить работу приложения, особенно если запрос занимает длительное время. Асинхронные запросы, напротив, не блокируют основной поток и позволяют программе продолжать выполнение других задач, пока ожидается ответ от сервера или другой операции. Асинхронные запросы часто используются для работы с сетью или файловой системой, чтобы улучшить отзывчивость и производительность программ. В Swift асинхронные операции реализуются через GCD или `async/await`. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
246
19
🤔 Как заставить оператор поддерживать функцию типа 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 Ставь 👍 и забирай 📚 Базу знаний
258
20
🤔 А если сделать свою структуру, то она будет поддерживать Copy-On-Write? Нет, по умолчанию пользовательские структуры не поддерживают COW. Чтобы реализовать это, нужно использовать обёртку с reference type и isKnownUniquelyReferenced для контроля над копированием. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
262