Swift | Вопросы собесов
2.13K subscribers
28 photos
952 links
Download Telegram
🤔 Какие инициализаторы можно добавить в extension?

Можно добавлять только новые инициализаторы, но не переопределять существующие. В структуре или классе можно добавить как обычные, так и convenience инициализаторы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
🤔 Как в IOS реализовать список с большим набором ячеек?

В iOS для работы с большими наборами данных в виде списков часто используются UITableView и UICollectionView. Эти компоненты эффективно обрабатывают и отображают большие объемы данных за счёт повторного использования ячеек.

🚩Реализация `UITableView` с большим набором ячеек

🟠Создание проекта и настройка интерфейса
Создайте новый проект в Xcode. Добавьте UITableView в ваш ViewController через Interface Builder или программно.

🟠Настройка `UITableView`
Создайте аутлет для таблицы в вашем ViewController. Назначьте ViewController в качестве делегата и источника данных для таблицы.
   import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}

// MARK: - UITableViewDataSource

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1000 // Большое количество ячеек
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Row \(indexPath.row)"
return cell
}
}


🟠Оптимизация с помощью повторного использования ячеек
Используйте метод dequeueReusableCell(withIdentifier:for:) для повторного использования ячеек, что улучшает производительность.
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Row \(indexPath.row)"
return cell
}


🚩Пример использования `UICollectionView`

Создание и настройка `UICollectionView`
Добавьте UICollectionView в ваш ViewController. Создайте аутлет для коллекции и настройте делегата и источник данных.
   import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
}

// MARK: - UICollectionViewDataSource

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 1000 // Большое количество элементов
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
cell.backgroundColor = .blue
return cell
}

// MARK: - UICollectionViewDelegateFlowLayout

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 100, height: 100) // Размер ячеек
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Можно добавить структуру в extension?

Да, можно добавлять вложенные типы, такие как структуры, классы или перечисления. Это полезно для организации кода и создания вспомогательных типов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое View (представление) и что такое window?

В iOS разработке термины "View" (представление) и "Window" (окно) имеют разные значения и играют различные роли в пользовательском интерфейсе.

🚩View (Представление)

Это базовый строительный блок для построения пользовательского интерфейса в iOS. Представления ответственны за отрисовку контента на экране и обработку взаимодействий с пользователем, таких как касания, жесты и т.д.

🟠Рендеринг контента
Представления отвечают за отображение графики, текста, изображений и других визуальных элементов.

🟠Иерархия представлений
Представления могут содержать другие представления, образуя иерархию. Главное представление в иерархии называется супервью (superview), а представления, вложенные в него, — подпредставления (subviews).

🟠События и взаимодействия
Представления обрабатывают пользовательские события, такие как касания и жесты.

🟠Макет и компоновка
UIView и его подклассы отвечают за управление расположением и размером визуальных элементов.

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = .red

let subview = UIView(frame: CGRect(x: 10, y: 10, width: 50, height: 50))
subview.backgroundColor = .blue

view.addSubview(subview)


🚩Window (Окно)

Это специальный тип представления, который служит контейнером для всех других представлений в приложении. UIWindow представляет собой основу, на которой строится весь пользовательский интерфейс приложения.

🟠Корневое представление
UIWindow содержит корневое представление (root view), которое в свою очередь может содержать другие представления.

🟠Управление отображением
Окно управляет отображением содержимого на экране и взаимодействием с системными событиями.

🟠Многооконные приложения
Хотя обычно в приложении используется одно основное окно, UIWindow позволяет создавать и управлять несколькими окнами, что может быть полезно для реализации сложных интерфейсов, таких как многооконные приложения на iPad.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let viewController = UIViewController()
viewController.view.backgroundColor = .white
window?.rootViewController = viewController
window?.makeKeyAndVisible()
return true
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Как опциональный тип реализован под капотом?

Опциональный тип (Optional) в Swift реализован как перечисление (enum) с двумя случаями:
1. some: хранит значение, если оно присутствует.
2. none: обозначает отсутствие значения, эквивалент nil.
Под капотом это работает как обёртка над значением, где используется дополнительный бит для указания на наличие или отсутствие данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
🤔 Каково разрешение экранов iphon'ов?

Разрешение экранов iPhone варьируется в зависимости от модели. Вот основные модели iPhone с их разрешениями экранов (в пикселях):

🟠iPhone SE (1-го поколения)
Разрешение: 1136 x 640
Размер экрана: 4.0 дюйма
Плотность пикселей: 326 ppi

🟠iPhone 6, 6s, 7, 8
Разрешение: 1334 x 750
Размер экрана: 4.7 дюйма
Плотность пикселей: 326 ppi

🟠iPhone 6 Plus, 6s Plus, 7 Plus, 8 Plus
Разрешение: 1920 x 1080
Размер экрана: 5.5 дюймов
Плотность пикселей: 401 ppi

🟠iPhone X, XS, 11 Pro
Разрешение: 2436 x 1125
Размер экрана: 5.8 дюйма
Плотность пикселей: 458 ppi

🟠iPhone XR, 11
Разрешение: 1792 x 828
Размер экрана: 6.1 дюйм
Плотность пикселей: 326 ppi

🟠iPhone XS Max, 11 Pro Max
Разрешение: 2688 x 1242
Размер экрана: 6.5 дюймов
Плотность пикселей: 458 ppi

🟠iPhone 12 mini
Разрешение: 2340 x 1080
Размер экрана: 5.4 дюйма
Плотность пикселей: 476 ppi

🟠iPhone 12, 12 Pro
Разрешение: 2532 x 1170
Размер экрана: 6.1 дюйм
Плотность пикселей: 460 ppi

🟠iPhone 12 Pro Max
Разрешение: 2778 x 1284
Размер экрана: 6.7 дюймов
Плотность пикселей: 458 ppi

🟠iPhone 13 mini
Разрешение: 2340 x 1080
Размер экрана: 5.4 дюйма
Плотность пикселей: 476 ppi

🟠iPhone 13, 13 Pro
Разрешение: 2532 x 1170
Размер экрана: 6.1 дюйм
Плотность пикселей: 460 ppi

🟠iPhone 13 Pro Max
Разрешение: 2778 x 1284
Размер экрана: 6.7 дюймов
Плотность пикселей: 458 ppi

🟠iPhone 14, 14 Pro
Разрешение: 2556 x 1179
Размер экрана: 6.1 дюйм
Плотность пикселей: 460 ppi

🟠iPhone 14 Pro Max
Разрешение: 2796 x 1290
Размер экрана: 6.7 дюймов
Плотность пикселей: 460 ppi

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3👍1
🤔 Можно ли сделать так, чтобы отменилась операция во время выполнения в GCD?

Нет, задачи в GCD (Grand Central Dispatch) нельзя отменить после их выполнения.
1. Однако можно использовать диспетчерские источники (dispatch sources) или проверять флаг отмены до выполнения операции.
2. Для более сложного управления используйте OperationQueue, где задачи можно отменять до их начала.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 В чем разница между points (точками) и пикселями (pixels)?

Разница между точками (points) и пикселями (pixels) в iOS важна для понимания разрешения экрана и отображения графики.

🚩Пиксели (Pixels)

🟠Что это
Пиксели — это мельчайшие единицы изображения на экране. Каждый пиксель представляет собой одну точку цвета на дисплее.
🟠Физическое представление
Пиксели — это физические элементы на экране устройства.
🟠Измерение разрешения экрана
Разрешение экрана указывается в пикселях (например, 1920 x 1080).

🚩Точки (Points)

🟠Что это
Точки — это логические единицы измерения, используемые в iOS для упрощения разработки интерфейсов. Они абстрагируются от физического разрешения экрана.

🟠Логическое представление
Точки позволяют дизайнерам и разработчикам создавать интерфейсы, которые будут одинаково хорошо выглядеть на устройствах с разным физическим разрешением.

🟠Измерение интерфейсов
Размеры и положения элементов интерфейса указываются в точках (например, 100 x 100 points).

🚩Коэффициент масштабирования (Scale Factor)

Коэффициент масштабирования (scale factor) определяет соотношение между точками и пикселями. Он показывает, сколько физических пикселей соответствует одной точке. Например:

🟠Стандартный дисплей (1x)
1 точка = 1 пиксель.
🟠Retina дисплей (2x)
1 точка = 2 пикселя.
🟠Super Retina дисплей (3x)
1 точка = 3 пикселя.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤔 Какие есть примитивы в GCD?

1. Очереди (Dispatch Queues): serial (последовательные) и concurrent (параллельные).
2. Группы (Dispatch Groups): позволяют объединять задачи для синхронизации их выполнения.
3. Семафоры (Dispatch Semaphores): обеспечивают ограничение доступа к ресурсам.
4. Таймеры (Dispatch Timers): планирование периодических задач.
5. Барьеры (Dispatch Barriers): для управления конкурентными операциями.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤔 Что означают IBOutlet и IBAction, для чего они нужны, и что значат для препроцессора?

Это атрибуты, используемые в разработке приложений на iOS для связывания элементов пользовательского интерфейса в Interface Builder с кодом на Swift или Objective-C. Они играют ключевую роль в интеграции визуального интерфейса и логики приложения.

🟠IBOutlet

Используется для создания соединений между элементами пользовательского интерфейса (например, кнопками, метками, таблицами и т.д.) в Interface Builder и свойствами в коде. Это позволяет вам программно взаимодействовать с этими элементами.

🚩Зачем это нужно

🟠Связывание UI элементов
Позволяет связывать визуальные элементы с кодом, чтобы можно было программно изменять их свойства (например, текст, цвет, размеры).
🟠Управление элементами интерфейса
Можно управлять состоянием и поведением элементов интерфейса из кода.

import UIKit

class ViewController: UIViewController {

// Связь кнопки с кодом
@IBOutlet weak var myButton: UIButton!

override func viewDidLoad() {
super.viewDidLoad()
// Изменение свойств кнопки программно
myButton.setTitle("Нажми меня", for: .normal)
}
}


🚩IBAction

Используется для создания методов, которые будут вызваны в ответ на действия пользователя (например, нажатие кнопки, переключение переключателя и т.д.) в Interface Builder. Это позволяет вам определять логику обработки событий.

🚩Зачем это нужно

🟠Обработка событий
Позволяет связывать действия пользователя с методами в коде.
🟠Реализация логики
Можно программировать логику, которая будет выполняться при взаимодействии с элементами интерфейса.

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var myButton: UIButton!

override func viewDidLoad() {
super.viewDidLoad()
myButton.setTitle("Нажми меня", for: .normal)
}

// Метод, который будет вызван при нажатии на кнопку
@IBAction func buttonTapped(_ sender: UIButton) {
print("Кнопка была нажата")
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🤔 Что такое шардирование?

Это процесс разделения больших наборов данных на более мелкие части (шарды) для распределённого хранения и обработки.
1. Каждый шард хранит часть данных, и они могут находиться на разных серверах.
2. Это повышает масштабируемость и производительность базы данных.
3. Сложность шардирования заключается в управлении распределением данных и маршрутизации запросов к нужным шардам.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5
🤔 Что такое многопоточность?

Это возможность центрального процессора (ЦПУ) или программы выполнять несколько задач (потоков) одновременно. В контексте программирования она используется для улучшения производительности приложений за счёт параллельной обработки задач. Это особенно важно для задач, требующих интенсивных вычислений, или приложений, которые должны одновременно реагировать на множество входных данных, таких как пользовательский интерфейс.

🚩Основные понятия

🟠Поток (Thread)
Минимальная единица обработки, которая может быть выполнена операционной системой.

🟠Конкуренция (Concurrency)
Способность программы делать прогресс в нескольких задачах одновременно. Конкуренция достигается за счёт переключения между задачами.

🟠Параллелизм (Parallelism)
Способность программы выполнять несколько операций одновременно, используя множество процессоров или ядер.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В чем разница между garbage collector и ARC?

1. Garbage Collector (GC): автоматически освобождает память, анализируя объекты, на которые больше нет ссылок. Он работает в фоне, но может вызывать задержки из-за пауз при сборке мусора.
2. ARC (Automatic Reference Counting): подсчитывает ссылки на объекты и освобождает их, когда счётчик ссылок достигает нуля. Это менее ресурсоёмко, так как выполняется в момент изменения ссылок, но требует осторожности для предотвращения циклических ссылок.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
🤔 Как многопоточность работает с UIKit?

Важный аспект разработки iOS-приложений, особенно для поддержания плавности пользовательского интерфейса. Основной принцип заключается в том, что все операции, связанные с обновлением пользовательского интерфейса, должны выполняться на основном потоке (main thread). Другие задачи, такие как сетевые запросы, обработка данных или любые длительные операции, могут выполняться на фоновых потоках.

🚩Основной поток

Это поток, в котором выполняются все операции пользовательского интерфейса. Все обновления интерфейса должны происходить на этом потоке, чтобы избежать конфликтов и обеспечить плавность анимаций и отзывчивость приложения.

🚩Фоновые потоки

Фоновые потоки используются для выполнения задач, которые могут занять значительное время, чтобы не блокировать основной поток. Это позволяет избежать зависаний и улучшить производительность приложения.

🚩Основные механизмы многопоточности

🟠Grand Central Dispatch (GCD)
Это низкоуровневый API для управления многозадачностью. Он позволяет легко выполнять задачи асинхронно на различных очередях (queues).
Main Queue: Очередь, связанная с основным потоком.
Global Queues: Глобальные очереди для выполнения фоновых задач.
   // Выполнение задачи в фоновом потоке
DispatchQueue.global(qos: .background).async {
// Долгая задача
let result = someLongRunningTask()

// Возвращение к основному потоку для обновления UI
DispatchQueue.main.async {
self.updateUI(with: result)
}
}


🟠Operation Queues
Это более высокоуровневый API для управления очередями операций (Operation). Он предоставляет больше возможностей для управления зависимостями между задачами.
   let operationQueue = OperationQueue()

let operation = BlockOperation {
// Долгая задача
let result = someLongRunningTask()

// Возвращение к основному потоку для обновления UI
OperationQueue.main.addOperation {
self.updateUI(with: result)
}
}

operationQueue.addOperation(operation)


🚩Примеры многопоточности

Асинхронная загрузка изображения
   func loadImageAsync(url: URL) {
DispatchQueue.global(qos: .userInitiated).async {
if let data = try? Data(contentsOf: url),
let image = UIImage(data: data) {
DispatchQueue.main.async {
self.imageView.image = image
}
}
}
}


Обработка данных в фоновом режиме
   func processDataInBackground(data: Data) {
DispatchQueue.global(qos: .utility).async {
let processedData = self.process(data)

DispatchQueue.main.async {
self.updateUI(with: processedData)
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🤔 Что такое MemoryLayout и как посчитать размер протокола?

MemoryLayout предоставляет информацию о размерах, выравнивании и смещении данных в памяти.
1. Размер можно посчитать с помощью MemoryLayout<MyType>.size.
2. Для протоколов это работает только при конкретизации типа, так как сами протоколы не имеют фиксированного размера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что можно сделать если клавиатура при появлении скрывает важную часть интерфейса?

Когда клавиатура появляется и скрывает важную часть интерфейса в iOS-приложении, нужно сдвигать или изменять размер представлений, чтобы они оставались видимыми.

🚩Подписка на уведомления о клавиатуре

Подпишитесь на уведомления о появлении и скрытии клавиатуры, чтобы корректировать интерфейс:
import UIKit

class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
var activeTextField: UIView?

override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets

var aRect = self.view.frame
aRect.size.height -= keyboardSize.height
if let activeField = self.activeTextField, !aRect.contains(activeField.frame.origin) {
scrollView.scrollRectToVisible(activeField.frame, animated: true)
}
}
}

@objc func keyboardWillHide(notification: NSNotification) {
let contentInsets = UIEdgeInsets.zero
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
}

deinit {
NotificationCenter.default.removeObserver(self)
}
}

extension ViewController: UITextFieldDelegate, UITextViewDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
self.activeTextField = textField
}

func textViewDidBeginEditing(_ textView: UITextView) {
self.activeTextField = textView
}

func textFieldDidEndEditing(_ textField: UITextField) {
self.activeTextField = nil
}

func textViewDidEndEditing(_ textView: UITextView) {
self.activeTextField = nil
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что такое автоматический подсчёт ссылок?

Это механизм управления памятью, который подсчитывает количество ссылок на объекты.
1. Когда счётчик ссылок объекта достигает нуля, память, занимаемая объектом, автоматически освобождается.
2. Этот механизм используется в Swift и Objective-C.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Почему мы должны релизить IBOutlet'ты во viewDidUnload?

В старых версиях iOS (до iOS 6), IBOutlet переменные обычно освобождались (релизились) в методе viewDidUnload, чтобы освободить память. Это было связано с управлением памятью и ресурсами на устройствах с ограниченными ресурсами.

🚩Обоснование

🟠Управление памятью
Устройства с ограниченными ресурсами могли столкнуться с нехваткой памяти. Освобождение ресурсов, связанных с представлениями, помогало улучшить производительность приложения и предотвращало его крах.

🟠Метод `viewDidUnload`
viewDidUnload вызывался, когда система освобождала память, удаляя невидимые представления. В этом методе освобождались ресурсы, которые можно было легко пересоздать при следующем отображении представления.

🚩Пример кода

До iOS 6, код мог выглядеть так
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel?

override func viewDidUnload() {
super.viewDidUnload()
// Освобождение IBOutlet
myLabel = nil
}
}


🚩Современные подходы

С введением автоматического управления памятью (ARC) и изменений в iOS 6, метод viewDidUnload был устаревшим и удалённым. Теперь система управления памятью в iOS гораздо эффективнее, и необходимость вручную освобождать IBOutlet-ы больше не актуальна. Вместо этого представления и связанные с ними ресурсы освобождаются автоматически, когда они больше не нужны.

🚩Современный код

Сейчас мы просто используем ARC и не беспокоимся об освобождении IBOutlet-ов
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!

override func viewDidLoad() {
super.viewDidLoad()
// Настройка myLabel
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Зачем нужны свойства "Content Hugging Priority"?

Content Hugging Priority управляет тем, насколько UI-элемент сопротивляется увеличению своего размера.
1. Более высокий приоритет заставляет элемент занимать минимальное пространство.
2. Это полезно при настройке адаптивных интерфейсов и разрешении конфликтов автолейаута.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1