679 просмотров
От 9 февраля

Ответы на вопросы для собеседования Swift-разработчика

1

Какие структуры данных есть в Swift?

В Swift существуют следующие структуры данных: - enum - struct - class - actor - protocol

2

Что такое перечисления (enumerations) в Swift?

Перечисление (enumeration) - это группа связанных значений. Перечисления позволяют писать безопасный для типов код. enum Direction { case North case East case South case West } Теперь в своем коде вы можете вызвать, например, Direction.North, вместо того чтобы использовать мистическую строку "North" (которая легко может быть неправильно написана и вызвать раздражающие ошибки).

3

В чем отличие ссылочных типов от типов-значений?

Экземпляры типов-значений (value type) хранятся в стеке, в то время, как экземпляры ссылочных типов (reference type) хранятся в куче. Также, при присваивании одного экземпляра value type другому экземпляру того же типа происходит копирование из одного экземпляра в другой, в то время как при присваивании одного экземпляра reference type другому экземпляру того же типа происходит копирование ссылки на объект, а не самого объекта. К value type относятся enum и struct. К reference type относятся class, actor, closure, func.

4

Можно ли переопределять структуры и перечисления в Swift?

Нельзя создать подкласс структуры или перечисления, как и переопределить их. Это связано с тем, что структура является типом-значением (value type), и компилятор должен знать ее точный размер во время компиляции, что переопределение делает невозможным.

5

Что такое Copy On Write в Swift?

Механизм CoW - это стратегия оптимизации памяти, которая используется для избежания неэффективных копирований данных. Что это такое? Когда мы создаем копию какого-либо объекта, структуры или массива, копирование может быть дорогим в плане производительности и затрат памяти. Вместо того, чтобы создавать новую копию объекта, механизм CoW использует "умные" указатели, которые указывают на одну и ту же область памяти до тех пор, пока не происходит изменение данных. Когда данные изменяются, механизм CoW создает новую копию данных, которая может изменяться независимо от оригинала. Как это работает? Механизм CoW используется для работы со структурами и классами в Swift. Когда вы создаете экземпляр структуры или класса, Swift создает копию этого объекта и сохраняет ее в памяти. Внутри структуры или класса могут быть свойства, которые могут изменяться, и когда вы изменяете эти свойства, Swift создает новую копию объекта, которая содержит измененные данные. Процесс работы механизма CoW в Swift можно разделить на три основных этапа: 1. Создание копии объекта. Когда вы создаете копию объекта в Swift, он использует механизм CoW для создания "умного" указателя, который указывает на одну и ту же область памяти, где хранятся данные. 2. Изменение данных. Когда вы изменяете данные в объекте, механизм CoW проверяет, есть ли другие "умные" указатели на ту же область памяти. Если такие указатели есть, механизм создает новую копию объекта, содержащую измененные данные, и перенаправляет указатели на новую область памяти. 3. Удаление объектов. Когда все "умные" указатели на объект становятся недействительными (то есть объект больше не используется в программе), объект должен быть удален из памяти.

6

Какие типы коллекций есть в Swift?

В Swift есть три типа для работы с коллекциями - Array, Set и Dictionary. Array - массив данных. Элементы имеют порядок, доступ к элементам происходит по индексу. Set - неупорядоченное множество. В множестве не может быть двух одинаковых элементов. Равенство элементов достигается проверкой hash-значения каждого элемента. В связи с этим элементы множества обязаны реализовать протокол Hashable. Доступ по индексу невозможен. Dictionary - словарь, элементы которого представляют из себя пару (ключ, значение). Ключи словаря должны быть уникальны. Это достигается ровно так же, как и в случае с множеством, через протокол Hashable. Значения словаря могут быть любым типом, на них не накладываются ограничения. Так же значения не должны быть уникальными. Доступ осуществляется по ключу и возвращает Optional значение, так как элемента по заданному ключу может не быть. Реализован через hash table.

7

Какие методы протокола Sequence вы знаете?

1. forEach - выполняет блок кода для каждого элемента коллекции. let arr = [1, 2, 3, 4] arr.forEach { print($0) } // prints // 1 // 2 // 3 // 4 2. map - выполняет блок кода для каждого элемента коллекции, в результате чего образовывается новая коллекция такого же размера, но тип значений коллекции может быть изменен, в зависимости от того, как реализован блок кода, который передается в map. let numbers = [1, 2, 3, 4] let mapped = numbers.map { Array(repeating: $0, count: $0) } // mapped = [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]] 3. flatMap - выполняет блок кода для каждого элемента коллекции, в результате чего образовывается новая коллекция такого же размера. Отличается от map тем, что, если результирующий элемент коллекции так же является коллекцией, то он будет встроен в результирующую коллекцию. Тип элементов результирующей коллекции так же может измениться, как и при выполнении map. let numbers = [1, 2, 3, 4] let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) } // flatMapped = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] 4. compactMap - выполняет блок кода для каждого элемента коллекции, в результате чего образовывается новая коллекция. Отличается от map тем, что размер результирующей коллекции не обязательно равен размеру изначальной. Элементы изначальной коллекции можут быть Optional и хранить в себе nil. Такой элемент не попадает в результирующую коллекцию. Тип элементов результирующей коллекции так же может измениться, как и при выполнении map. let numbers: [Int?] = [1, nil, 3, 4, nil] let compactMapped = numbers.compactMap { if let element = $0 { Array(repeating: element, count: element) } else { return nil } } // compactMapped = [[1], [3, 3, 3], [4, 4, 4, 4]] 5. filter - выполняет блок кода для каждого элемента коллекции, результатом которого есть значение Bool. При возврате из блока false, элемент исключается из результирующей коллекции. let map = [ "weather": "Good", "temperature": 27, "humidity": 34.3 ] let result = map.filter { (key, _) in key == "temperature" } // result = ["temperature": 27] 6. reduce - выполняет блок кода для каждого элемента коллекции, результатом которого становится накопление нового результата. Используется, как правило, для получения единого результата из коллекции. let arr = [1, 2, 3, 4] let resut = arr.reduce(0) { partialResult, value in if partialResult == 0 { return value } return partialResult * 10 + value } // result = 1234

8

Что такое протокол в Swift?

protocol - особый тип данных, экземпляры которого не могут быть созданы. Протоколы описывают будущий функционал, но не реализовывают его. Имплементация протокола кладется на плечи конкретного типа, который собирается его реализовать. Протокол может быть принят классом, структурой или перечислением для обеспечения фактической реализации этих требований. Любой тип, который удовлетворяет требованиям протокола, реализует данный протокол.

9

Что такое associated type?

associated type - механизм параметризации протокола. Используется для обеспечения большей гибкости работы с протоколом в силу ухода от конкретного типа к параметру. По своей сути generics для протокола. Так как протоколы с assotiated type не являются достаточно конкретными, объявить переменную данного типа или передать напрямую подобный тип как параметр функции невозможно. Здесь на помощь нам приходят ключевые слова any и some. Данные два ключевых слова решают одну и ту же проблему, но немного по-разному. any создает коробку вокруг конкретного типа, который удовлетворяет данному протоколу. some указывает, что пусть это неизвестно заранее, но на момент компиляции программы конкретный тип переменной будет известен точно.

10

Что такое Any и AnyObject?

Any - специальный тип, который является всем сразу и ничем одновременно. Каждый тип в Swift может быть привиден к типу Any. Any используется тогда, когда мы не можем использовать generics, но при этом хотим иметь гибкость передачи аргументов разного типа. Недостаток у такого подхода всего один: так как в итоге тип данных будет Any, мы должны наверняка знать, какой тип был до этого, чтобы получить возможность восстановить данные после получения. AnyObject - специальный тип, такой же, как и Any, но с ограничением только на reference type. Каждый AnyObject может быть Any, но не каждый Any может быть AnyObject. Ключевое слово AnyObject также используется для ограничения протокола на реализацию только reference type типами.

11

Что такое замыкания?

Замыкания - это экземпляр функции, которая имеет доступ к определенному контексту и/или захватывает определенные значения и может быть вызвана позже. Замыкания могут захватывать и хранить ссылки на любые константы и переменные из контекста, в котором они объявлены. Эта процедура известна как заключение этих констант и переменных, отсюда и название "замыкание". Swift выполняет всю работу с управлением памятью при захвате за вас. Замыкания принимают одну из трех форм: 1. Глобальные функции являются замыканиями, у которых есть имя и которые не захватывают никакие значения. 2. Вложенные функции являются замыканиями, у которых есть имя и которые могут захватывать значения из включающей их функции. 3. Замыкающие выражения являются безымянными замыканиями, написанные в облегченном синтаксисе, которые могут захватывать значения из их окружающего контекста.

12

Что такое escaping и nonescaping?

Согласно документации, вы обязаны пометить замыкание, передаваемое в функцию в качестве параметра, ключевым словом @escaping, если оно будет вызвано после возвращения из функции. Иными словами, если замыкание (closure) будет вызвано асинхронно внутри (callback) или за пределами (delegate) функции, то вы должны его пометить как @escaping. По сути @escaping позволяет вам отложить выполнение передаваемого в качестве параметра замыкания до нужного вам момента (например, по срабатыванию таймера или по завершению асинхронной операции). Если вы попробуете присвоить non-escaping замыкание в свойство класса, структуры или перечисления вы получите compile-time ошибку: class MainDispatcher { var work: (() -> Void)? = nil func async(_ block: () -> Void) { self.work = block } } Если вы попробуете вызвать non-escaping замыкание асинхронно (то есть там где ожидается escaping замыкание), вы также получите compile-time ошибку: class MainDispatcher { func async(_ block: () -> Void) { DispatchQueue.main.async { block() } } } По умолчанию замыкание, передаваемое в качестве параметра, является non-escaping, поэтому там, где вам необходимо вы должны использовать ключевое слово @escaping. class MainDispatcher { var work: (() -> Void)? = nil func async(_ block: @escaping () -> Void) { self.work = block DispatchQueue.main.async { self.work?() } } func sync(_ block: () -> Void) { DispatchQueue.main.sync { block() } } }

Логотип ДевстанцииАвторизуйтесь, чтобы просматривать следующий контент
14

Что такое список захвата (capture list)?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
15

Что такое Optionals (опционалы)?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
16

Что такое generics и для чего они нужны?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
17

Что такое typealias в Swift?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
18

В чём разница объявления констант в Objective C и Swift?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
19

В чём разница между structure и class?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
20

В каких случаях использовать класс, а в каких — структуру?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
21

Какие есть уровни доступа в Swift?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
22

Зачем нужно ключевое слово final?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
23

В чём разница модификаторов static и class?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
24

Какими способами можно развернуть optional?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
25

Когда не получается избежать неявного развертывания optionals?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
26

В чём разница между nil и .none?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
27

Для чего нужен оператор вида «??» ?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
28

Что делает init() в Swift?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
29

Что такое отложенная инициализация?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
30

Что такое деинициализаторы в Swift?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
31

В чем разница между функциями и методами в Swift?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
32

Какой синтаксис у внешних параметров?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
33

Как передавать переменные в качестве ссылок?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
34

Зачем нужно ключевое слово mutating?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
35

Что такое модуль?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
36

Зачем нужна инструкция defer?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
37

Зачем нужна инструкция do?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
38

Зачем нужны блоки условной компиляции?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
39

Что такое extension?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
40

Чем отличается цикл for от forEach?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
41

Какая модель работы с памятью в iOS?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
42

Что такое weak и unowned?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
43

Можно ли объеденить код на ObjC и Swift в одном проекте?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
44

Можно ли объеденить код на C/C++ и Swift в одном проекте?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
45

Что такое conditional conformance?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
46

Что такое swizzling?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
47

Что такое Delegate?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
48

Что такое Observer?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
49

Что такое async/await и Task?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
50

Что такое actor?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
51

Что такое reference cycle?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
52

Что такое счетчик ссылок?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
53

Что такое URLSession?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
54

Какие виды persistency вы знаете в iOS?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
55

Что такое plist файл?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
56

Что такое UserDefaults?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
57

Расскажите про жизненный цикл приложения

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
58

Что такое Storyboard, Xib, Nib?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
59

Что такое UIKit?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
60

Что такое AutoLayout?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
61

Какое мин. количество constraints надо задать, чтобы определить положение UIView на экране?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
62

Назовите основные аттрибуты constraint

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
63

Что такое contentHuggingPriority и contentCompressionResistancePriority?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
64

Что такое UIStackView?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
65

Расскажите про жизненный цикл UIViewController

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
66

Чем отличаются frame и bounds?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
67

Что такое UISegue?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
68

Что такое UINavigationController?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
69

Что такое UITabController?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
70

Что такое UITableView?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
71

Что такое UICollectionView?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
72

В чем разница между UICollectionView и UITableView?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
73

Что такое GestureRecognizer?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
74

Что такое LaunchScreen.storyboard?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
75

Что такое size class?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
76

Как построить UI в коде?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
77

В чем разница между CALayer и UIView?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
78

Как можно реализовать свою анимацию перехода между двумя экранами?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
79

Что такое UISplitViewController?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
80

В чем разница между layoutIfNeeded(), setNeedsLayout() и layoutSubviews()?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
81

Что такое UIResponder?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
82

Какие UI операции можно делать не на главном потоке?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
83

Что такое UIScene?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
84

Сколько LaunchScreen сторибордов может быть в приложении?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
85

Что такое CADisplayLink?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
86

Что такое SwiftUI?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
87

Что такое View

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
88

Что такое ViewModifier?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
89

Что такое CoreData?

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
Хотите стать частью сообщества Девстанции?
Вступайте в наш чат в Telegram

Также в этой категории

Задачник
  16 задач

Алгоритмические задачи по Swift

Решения для задач с собеседований по Swift

950 просмотров
От 21 февраля
Викторина
  14 вопросов

Викторина на знание Swift

Вопросы для проверки Swift-разработчика

38 просмотров
От 9 февраля

Топ тредов

Gravatar for 1847arsen
Arsen
: Задача в Python под названием "Кратчайший путь в матрице"

Последнее сообщение:
Gravatar for 1847arsen
Arsen
: Ошибка на 3 тесте # Ожидаемый результат: 2 а должен быть 1
1 сообщение
31 просмотр

Gravatar for 1233freddypopa
freddypopa
: Добавить чекбокс, который отвечает за показ ранее тронутых задач (черновик)

Последнее сообщение:
: Отличная идея! Возьмём её на заметку!
1 сообщение
127 просмотров

: Предложите идею и получите спонсорский доступ на месяц

Последнее сообщение:
Gravatar for 1236borisops
Borisops
: Добавить темную тему) что бы можно было посмотреть сложность алгоритма и добавить тэги.
10 сообщений
342 просмотра

Все категории