Співбесіда Q/A

Algorithms and Data Structures

Типи колекцій у Swift, відмінності в складності операцій

easy
Short Answer: Swift має 3 загальні типи колекцій: arrays, dictionaries та sets. Array — це впорядкований список даних. Dictionary — це невпорядкована колекція елементів, він зберігає елементи в парах ключ/значення. Set — це невпорядкована сукупність унікальних даних. Усі ці типи є загальними і можуть працювати з будь-яким типом

Array

Set

Dictionary

Collection Types

 

Array є впорядкованою колекцією з довільним доступом

Read – O(1)  – читання за індексом

Search – O(N)

Add element – O(1) або O(N) у найгіршому випадку. Якщо array потрібно перемістити в новий простір пам’яті, то O(N). Якщо в array достатньо місця з початку або в кінці – ніж O(1). O(N), якщо додавати всередину array зі зсувом.

Removing element – O(N) слід зсунути після видалення.

 


Set — це сукупність унікальних даних

Search – O(1)

Add element –  O(1)

Removing element – O(1)

У найгірших випадках із зіткненнями це O(N) для всіх операцій

У set(і) є прихований array, де індексується хеш-код, який є результатом хеш-функції значення (value). Цей розрахований індекс зберігає значення.

Якщо нові різні значення мають однаковий хеш-код, вони зберігаються в тому самому елементі, що й нове значення пов’язаного списку

Якщо нові значення однакові та хеш-коди також однакові, ця операція вставки буде проігнорована, оскільки це значення не є унікальним і вже є в наборі


Dictionary — це набір пар ключ-значення

Search – O(1)

Add element –  O(1)

Removing element – O(1)

У найгірших випадках із зіткненнями це O(N) для всіх операцій

У dictionary є прихований array, де індексується хеш-код, який є результатом хеш-функції ключа (key). Цей обчислений індекс зберігає ключ і значення.

Якщо нові різні ключ-значення мають той самий хеш-код, вони зберігаються в тому самому елементі, що й нове значення зв’язаного списку

Якщо нові значення однакові та хеш-коди також однакові, ця операція вставки буде проігнорована, оскільки це значення не є унікальним і вже є в Dictionary


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Swift

Що таке "CLOSURES" та навіщо застосовується?

easy
Short Answer: Closures у Swift – це функціональні об'єкти, які дозволяють передавати функції як значення, зберігати їх у змінних та передавати в інші функції. Вони також можуть захоплювати та зберігати посилання на змінні та константи з навколишньої області видимості. Closures не потребують слова func для опису, можуть мати не іменні вхідні параметри, не можуть мати значення вхідних параметрів за змовчуванням. Closure має бути описана один раз, викликана безліч разів. Closures можна використовувати для створення анонімних функцій, які можуть бути передані як аргументи іншим функціям або збережені у змінних чи константах. Вони можуть бути використані для виконання різних операцій, таких як сортування, фільтрація, обхід колекцій та багато іншого.

У Swift є три типи closures:

Global functions – це функції, які оголошуються у глобальній області видимості програми.
Nested functions – це функції, які оголошуються всередині іншої функції та мають доступ до змінних та константів із зовнішньої функції.
Closure expressions – це анонімні функції, які можуть бути передані як аргументи іншим функціям або збережені у змінних чи константах.

@escaping, non-escaping тa Optional closure:

@escaping – Інформує про те, що closure може бути збережений або як може пережити скоуп що викликає.

non-escaping – Інформує про те, що closure не буде збережений і він не переживе скоуп функції що викликає.

Optional closure – якщо closure опціональний, то маркувати його як @escaping не потрібно, він за змовчуванням буде опціональним.

Func і closures – Reference Type:

Це коли функції та closures записуються у змінні, вони не створюють нові обʼєкти, вони зберігають reference (посилання). Тобто
closure можна зберігати у багатьох місцях, але фактично це буде один і той самий closure, а не його копії.

Retain Cycle – це ситуація коли 2 обʼєкти тримають сильні посилання один на одного і цим самим тримають один одного у памʼяті. Це веде до того, що вони не дають ARC знищити себе з памʼяті (через те, що ARC тримає обʼєкт до поки на нього є хоч одне сильне посилання.Ця ситуація призводить до витоку памʼяті, що своєю чергою може призвести до аварійного закриття додатка.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Типи колекцій у Swift, відмінності в складності операцій

easy
Short Answer: Swift має 3 загальні типи колекцій: arrays, dictionaries та sets. Array — це впорядкований список даних. Dictionary — це невпорядкована колекція елементів, він зберігає елементи в парах ключ/значення. Set — це невпорядкована сукупність унікальних даних. Усі ці типи є загальними і можуть працювати з будь-яким типом

Array

Set

Dictionary

Collection Types

 

Array є впорядкованою колекцією з довільним доступом

Read – O(1)  – читання за індексом

Search – O(N)

Add element – O(1) або O(N) у найгіршому випадку. Якщо array потрібно перемістити в новий простір пам’яті, то O(N). Якщо в array достатньо місця з початку або в кінці – ніж O(1). O(N), якщо додавати всередину array зі зсувом.

Removing element – O(N) слід зсунути після видалення.

 


Set — це сукупність унікальних даних

Search – O(1)

Add element –  O(1)

Removing element – O(1)

У найгірших випадках із зіткненнями це O(N) для всіх операцій

У set(і) є прихований array, де індексується хеш-код, який є результатом хеш-функції значення (value). Цей розрахований індекс зберігає значення.

Якщо нові різні значення мають однаковий хеш-код, вони зберігаються в тому самому елементі, що й нове значення пов’язаного списку

Якщо нові значення однакові та хеш-коди також однакові, ця операція вставки буде проігнорована, оскільки це значення не є унікальним і вже є в наборі


Dictionary — це набір пар ключ-значення

Search – O(1)

Add element –  O(1)

Removing element – O(1)

У найгірших випадках із зіткненнями це O(N) для всіх операцій

У dictionary є прихований array, де індексується хеш-код, який є результатом хеш-функції ключа (key). Цей обчислений індекс зберігає ключ і значення.

Якщо нові різні ключ-значення мають той самий хеш-код, вони зберігаються в тому самому елементі, що й нове значення зв’язаного списку

Якщо нові значення однакові та хеш-коди також однакові, ця операція вставки буде проігнорована, оскільки це значення не є унікальним і вже є в Dictionary


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Tooling
UI

Поясніть iOS Responder Chain?

difficult
Short Answer: The Responder Chain — це ім’я, дане створеному UIKit зв’язаному списку об’єктів UIResponder, і воно є основою для всього, що стосується подій (наприклад, дотику та руху) в iOS. Responder Chain керується UIKit за лаштунками, і лише в деяких випадках вам потрібно взаємодіяти з ним безпосередньо (наприклад, робота з UITextField). Це реалізація шаблону проектування Chain Of Responsibility з книги GOF

Documentation

Using The Responder Chain

iOS Responder Chain: UIResponder, UIEvent, UIControl and uses

Програми отримують і обробляють події за допомогою об’єктів відповідачів (responders). Об’єкт responder – це будь-який екземпляр класу UIResponder, а загальні підкласи включають UIView, UIViewController і UIApplication. Responder(и) отримують необроблені дані про подію та повинні або обробити подію, або переслати її іншому об’єкту responder(а). Коли ваша програма отримує подію, UIKit автоматично направляє цю подію до найбільш відповідного об’єкта responder(а), відомого як First responder.

Необроблені події передаються від responder(a) до responder(a) в активному ланцюжку responder(ів), який є динамічною конфігурацією об’єктів responder(ів) вашої програми. На наступному зображенні зображено responder(и) у програмі, інтерфейс якої містить UILabel, UITextField, UIButton та два фонових режими. Діаграма також показує, як події переміщуються від одного responder(a) до іншого, слідуючи Responder Chain.

Якщо view вирішує не обробляти подію дотику, воно буде надіслано вгору по responder chain, який слідуватиме таким шляхом:

  • First responder, — перевірений на попадання view (hit-tested view)
  • Next responder – його superview
  • Responder chain продовжується вгору по ієрархії view, поки не досягне root view, пов’язаного з контролером
  • Цей контролер перегляду буде наступним responder(ом)
  • Якщо цей контролер перегляду є кореневим контролером, то вікно буде наступним responder(ом)
  • Об’єкт UIApplication є наступним responder(ом)
  • Останнім responder(ом) у ланцюжку є UIApplicationDelegate

Програма отримуватиме події з таких джерел, як:

  • UIControl Actions: це дії, які реєструються за допомогою action/target патерну
  • User events: події від користувачів, такі як дотики, струшування, рухи тощо
  • System event: брак пам’яті, повороти екрану тощо

Визначення first responder

UIKit призначає об’єкт першим відповідачем на подію на основі типу цієї події. Типи подій включають:


Примітка

Події руху, пов’язані з акселерометрами, гіроскопами та магнітометрами, не слідують за responder chain. Замість цього Core Motion доставляє ці події безпосередньо до визначеного об’єкта. Щоб отримати додаткові відомості, перегляньте Core Motion Framework

Коли відбувається дотик, UIKit створює об’єкт UITouch і пов’язує його з view. Коли місце дотику або інші параметри змінюються, UIKit оновлює той самий об’єкт UITouch новою інформацією. Єдина властивість, яка не змінюється, це view. (Навіть якщо місце дотику переміщується за межі вихідного view, значення властивості view дотику не змінюється). Коли дотик завершується, UIKit звільняє об’єкт UITouch.


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------