The knowledge base for interview preparation.
Кожна тема скаладється з двох частин, інформаці і запитання. Інформація це набір загальних та корисних тез, які можуть допомогти вам відповісти на загальні питання по цій темі (Приклад, що таке комбайн, що ти по ньому знаєш). Частина запитань, це набір конкретних запитань, які можна зустріти на співбесідах.
- General
- AADS
- OOP
- SOLID
- Architectures
- Design patterns
- Frameworks
- Memory Management
- Runloop
- Classes & Structs
- Collections
- Concurrency
- Dispatch method
- Generics
- Initialization
- Persistance
- Debug
- Closures
- Enums
- Git
SwiftUI provides views, controls, and layout structures for declaring your app’s user interface and tools to manage the flow of data. Стоїть на трьох китах:
-
Opaque type https://habr.com/ru/company/otus/blog/542080/ Один з "типів" типів (є абстрактинй тип (протоколи), конкретний(наші дефолтні типи), загальний(дженерік) і непрозорий). Реалізовується за допомогою ключового слова some, працює він як реверснутий дженерік, тобто ми не ззвоні вказуєм який тип має бути, а тип визначається з середині і приховується на зовні, хоча повертається конкретний (це відрізнає його від протокола). Дає нам можливість використовувати протокол з асосіейтед тайпом як тип повернення (без непрозорого типу у нас би була помилка компіляції, що такий тип мож використовувати тільки з дженеріком). Якщо в середені метода є умови, то може повертатися тільки один тип (з протоколом такого б не було, там можна або один або інший або третій, головне щоб вони реалізовували протокол)
-
result builders https://habr.com/ru/company/otus/blog/555848/ https://www.hackingwithswift.com/swift/5.4/result-builders Построители результатов (result builders) в Swift позволяют получать результирующее значение из последовательности компонентов — выставленных друг за другом «строительных блоков». Описывающий объединение неких частей в окончательный результат. Дає наможливість писати код деклеративно і на виході отримувати одне значення як результат (у випадки з вюбілдер це буде TypelView де аргументи це перелік елементів шо ми додали, макс 10), Дає нам можливість використовувати іф елс в свіфтюай, Замежами свіфтюай можна використовувати щоб зручніше писати констрейнти, або стрінги. Щоб самому створити резлтбілдер, треба використати пропертів врапер @resultbuilder а також реалізувати потрібні методи білдблок, білдайзе(щоб можна убло іф елс писати), білдарей, білдлуп ітд)
-
датафлов проперті врпери
- стейт(це для велью типів коли власником є конкретне вю)
- стейтобджект(це для референс типів, які мусять реалізовувати ObservableObject, коли власником є конкретне вю. Стейтобджекта не було в першій версії світюай і замість нього використовували обзерведобджект, але тоді появлявся баг, що при апдейті юая цей обєкт теж перестворювався)
- байндінг(щоб передавати стейт на інші вюшки і щоб вони могли його міняти) Обновлення по байдінгу працює в дві сторони, міняємо значення якоїсь проперті то апдейтиться юай, міняємо це за допомогою юая то абдейтиться і пропертя
- обзервердобджект (це для референс типів, які мусять реалізовувати ObservableObject, коли власником є не конкретне вю, а цей обєкт передають у в конретне вю звідкись)
- енвайронментобджект (можна добавляти до вю за допомогою модифікатора і тоді всі сабвюшки цього вю теж будуть мати до нього доступ)
- енвайронмент це похоже до енваронментобджекта, може шеритися між свюхами, але це ківелю пари які відповідальні за настройки (дісміс, опенурл ітд)
- паблішед(це з комбайна) якщо маємо клас який реалізовує ObservableObject, то щоб юай реагував на зміни пропертів цього класу, проперті мають мати паблішед проперті врапер
The Combine framework provides a declarative Swift API for processing values over time. Потоки даних які приходять звідусіль: таймери доторки, жести ітд.
Завдяки комбайн Деякі інструменти які ми використовували можна замінити на Combine (Делегати, колбеки, таргетекшени, нотіфікейшни цент обсервери)
Асинхронний код тепер виглядає як синхронний.
Від імперативного програмування відрізняється тим шо при зміні наприклад таблиці нам не треба робити релоад вю, а якшо пропертя це сума двох інших пропертей, то при зміні цих пропертей, сума перерахується сама.
Уявимо у нас є нотіфікешн центр який робить пост і обсервер який цей нотіфікешн ловить, в комбайні це паблішер який відправляє, а сабскрайбер це той хто ловить, між ними є оператори,
паблішер і сабскрайбер є протоколами, пабліше в собі має аутпут і ерор, а сабскрайбер має інпут і еррор, аутпут і інпут мають бути одного типу, також тип помилки теж має бути одинаковий. При використанні паболішерів, якшо не треба помилки то використовувати Never, якшо треба можна використати setFailureType.
Pulisher неможе бути використаний напиряму бо це протокол, треьба використовувати AnyPublisher і модифікатор eraseToAnyPublisher для тайп кастінга
Пайплайн працює настпуний чином: підписуємся на паблішера - паблішер створює підписку і відправлає його сабскрайберу - сабскрайбер просить дані - паблоішер їх відправляє - паблішер закриває підписку
Байндінгів для uikit нема окрім тих які робить комюніті.
Приклади паблішерів:
- Just (самий простий, повертає результат 1 раз і закінчується)
- Future (нагадує знайоми нам Result, має фейлер і саксес)
- Fail (зразу зипняє пайплайн з помилкою)
- Empty (не публікує ніяких значень, як EmptyView в SwiftUI)
- Defered (отложений паблішер, викликається незразу)
- Sequence (відправляє елементи масиву почерзі)
Також є така штука як Subject, який теж відноситься до паблішерів, (воно похоже @Published проперті врапера?)
Приклади сабскрайбера:
- onReceive (з СвіфтЮАЙ)
- asign (для обновлення властивостей обєкта, але тип помилки має завжди бути Never)
- sink (буває 2 типів: reciveValue або reciveCompletion i reciveValue)
Оператори:
- для мапінга (scan (накопичує дані і публікує коли вони змінюються, для прикладу юзер вводить текст, то це пабліше буде видвати a/ab/abc ітк), map, flatMap і також їхні варіанти з try якшо є можливість викиду помилки)
- для фільтрування (filter, compactMap, replaceEmpty, replaceError, removeDuplicates, collect і їхні варіанти з try)
- метчінг критерія (allSatisfy, contains, containsWhere коли треба кастомні умови)
- для масива (first last drop, prefix, output)
- обєднання (combineLatest, merge, zip)
- відловлення помилок (catch, retry, mapError, asrtNoFailure)
- для контрою часу (debounce, delay, timeout, thottle, measureInterval)
- debuging (breakpoint, pring, handleEvent)
Щоб мати можливість створити якусь функціональність не привязючись до конкретного типу, позволяє забрати багато дублікації коду, позволяє зробити таку штуку шо метод може примаймати два аргумента будь якого типу, але цей тип є однаковим для двох аргументів. Ми можемо використовувати протоколи для обмеження дженеріків
- що таке ключове слово where? яка різниця між "дженері:протоко" і "дженерік where"
Answer
Відповідь: дає нам можливість уточняти асошіейтед тип - Яка диспечирізація в дженеріка
Answer
Пошукати про це інфу, вона міняєтьс якщо дженерік в іншому модулі. вроді вона статична, а якщо дженерів іншому модулі, чи якомусь фреймворку то вона міняється на динамічну, бло непонятно шо буде в середині.
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
- Що таке конвіньєнс конструктор, що зними відбувається при наслідуванні
Answer
Відповдь: це конструктор для зручності, він в середині мусить викликати інший ініціалізатор цього класу - Приклад реквєд ініт
Answer
Відповідь: ініт віз кодер в вюконтролері, або коли реалізовуємо протокол з конструктором в середині - чому коли ми обявляємо свій конструктор нас заствляє реалізувати реквєрд конструктор
Answer
Відповідь: клас наслідує конструктори свого батька до того моменту поки не обявляє свої конструктори - Чому для класу свіфт не може згенерувати нам конструктор, як робить це зі структурою
- три типи конструкторів
Answer
Відповідь: рекваєрд, конвініент, дезігнейтед - який ланцюг ініціалізації обєкта, чи може конвініанс викликати супер?
Answer
Відповідь: конвініанс має виклакти в собі або інший конвініас, або дезігнейте, дезігнейтед має виклаккти супер якшо було наслідування - як не втрати в структурі згенерований конструктор, якшо хоч додати кастомний?
Answer
Відповідь: перенести кастомний в екстеншн
- Кешування, які є способи кешування
- які є опції для стореджу і персістенс
Answer
є колекції, юзердефолтс, кічейн, запис в фаіл, кордата чи реалм - Як зберегти обєкт в юзердефолтс
Answer
треба щоб він реалізовував протокол Codable
- які інструменти є дебагінга
Answer
інструменти, брейкпоінти, асерти, перкондішн, прінти, вю ієархія - Які основні тулзи Instruments, для яких задач їх використовувати
- Як емолювати поганий інтернет
Answer
(Network Link Conditioner) та ще інші способи, найти в неті, дрисати
- що таке трейлінг кложура
- чи може функція мати кложуру як тип повертання
- Що стається коли кепчер ліст ловить велью значення
Answer
Відповді, створює копію яка не змінюється, а якшо захоплює клас, то він уже захоплює це по ссилці і там по іншому працює - escaping, nonescaping, autoclosures, кепчурліст і як він працює, якими кложури є по дефолту(нонескейрінг, хоча спочатку були ескайпінг) чому так? чому поміняли?
Answer
https://www.hackingwithswift.com/example-code/language/what-is-the-autoclosure-attribute на решту іну треба найти
- Як реалізувати rawValue в енама який має асосіетед вельюс?
Answer
Потрібно самому реалізувати конструктор init?(rawValue: RawValue) і компютед пропертю var rawValue: RawValue - Як зберегти енам в юзер дефолтс?
Answer
Якщо енам має асосіейтед вельюс, то потрібно щоб він реалізовував протокол Codable і тоді зберігати його як Data чи Dictionary. Якщо енам немає асосіейтед вельюс то просто зберігати його рав дата. - Чому всякі константи типу кольорів, чи подібні речі краще мати як енам ніж структуру?
Answer
The advantage of using a case-less enumeration is that it can't accidentally be instantiated and works as a pure namespace. - Реалізацією чого є енам з кейсами some i none?
Answer
Це раеалізація Optional
- Що таке git bisect, для чого він використовується?
Answer
Бінарний пошук по комітах щоб знайти той в якому баг - Ситуація: я працював в гілці А, з неї створив гілку Б, як змерджити з мастер тільки зміни гілки Б?