1. Расскажи про reference и value-типы в Swift.
2. Какие бывают исключения, когда value-типы хранятся не на стеке?
3. Что происходит, когда мы передаем value-тип, или присваиваем его в переменную, или передаем в функцию?
4. Для каких типов данных используется механизм copy-on-write?
5. Пробовал ли ты сам реализовывать copy-on-write?
6. Можно ли как-то изменить значение переменной, которая является value-типом, переданную в функцию?
7. Расскажи про ARC (Automatic Reference Counting).
8. На каком этапе происходит ARC?
9. Чем отличается weak от unowned?
10. В какой момент происходит деаллокация объекта, когда счетчик сильных ссылок достигает нуля?
11. Подскажи, потокобезопасен ли счетчик ссылок?
12. Можно ли как-нибудь вывести объект из управления ARC?
13. Можно ли создать retain cycle для структур?
Method Dispatch
14. Расскажи, какие методы диспетчеризации ты знаешь, и подробно опиши каждый.
15. Можно ли в классе "зафорсить" статическую диспетчеризацию?
16. Какие еще есть способы получить статическую диспетчеризацию?
17. Как сделать так, чтобы использовался message dispatch?
18. Почему message dispatch самый медленный?
19. Можно ли в Swift вызвать функцию у объекта класса, который не реализован?
View и View контроллеры
20. Для чего нужен UI View Controller?
21. Что представляет собой View?
22. Если мы в View Controller обратимся к view, она будет nil?
23. Есть ли способ узнать, создана ли view, не запуская жизненный цикл?
24. Какие способы загрузки view ты знаешь?
25. Может ли быть такая ситуация, что viewdidload будет вызван дважды?
26. На каком этапе жизненного цикла view controller известны финальные фреймы всех subview?
27. В каком порядке будут вызваны API-методы, если ты пушишь экран в UINavigationController (текущий контроллер A, пушишь B)?
28. В каком методе View Controller можно вызывать анимацию view или subview?
29. Как можно "зафорсить" layoutSubviews?
Concurrency
30. Расскажи, какие проблемы в многопоточном коде ты встречал и как их решал?
31. Какие типы очередей бывают в GCD?
32. Какие Serial и Concurrent очереди есть в Swift "из коробки"?
33. Можно ли написать такой код, который будет читать с разных потоков, но писать только с одного?
34. Чем асинхронность отличается от многопоточности?
Задачи
Практика35. Задача: Объясни, для чего в этом коде используется ключевое слово inout. Как inout влияет на поведение функции и переменной a? Что будет, если убрать ключевое слово inout?
var a = 5
func change(inout a: Int) {
a = 10
}36. Задача: Что выведет программа и почему?
var closure: (() -> Void)?
func doSomething() {
var v = 5
closure = { [v] in
print(v)
}
v = 10
}
doSomething()
closure?()37. Задача: Что и в каком порядке выведет программа и почему?
class Person {
let name: String
init(name: String) { self.name = name }
deinit { print("(name) is deallocated") }
}
do {
var person: Person? = Person(name: "Piterson")
var person2: Person? = nil
var person3: Person? = nil
person2 = person
person3 = person2
person = nil //1
person2 = nil //2
person3 = nil //3
}38. Задача: Что будет выведено и почему?
protocol MyProtocol { }
extension MyProtocol {
func method() { print("In Protocol") }
}
struct MyStruct: MyProtocol {
func method() { print("In Struct") }
}
let myStruct = MyStruct()
let myProtocol: MyProtocol = myStruct
myStruct.method()
myProtocol.method()39. Задача: Написать функцию, которая из коллекции животных находит и возвращает отсортированный по алфавиту список названий длиннее трёх символов.
let animalsInfo = [
"Fishes": ["Seabass", "Lion Fish", "Tuna"],
"Farm animals": ["Sheep", "Chicken", "Goat"],
"Home animals": ["Dog", "Cat", "Tiger"]
]40. Задача: Написать GeneralLogger, который работает с любым видом логгеров.
struct A { let value: Int }
struct C { let someValue: Double; let someValue2: Int }
struct LoggerA { func log(with a: A) { print(a.value) } }
struct LoggerC { func log(with a: C) { print(c.someValue, c.someValue2) } }41. Задача: Реализовать SomeNetworkService для скачивания текста и использования в ViewController.
42. Задача: Реализовать возможность асинхронно запустить несколько AsyncWorker и получить результаты в массиве.
43. Задача: Написать функцию, считающую сумму элементов бинарного дерева поиска в заданном диапазоне.
class Tree {
var value: Int
var left: Tree?
var right: Tree?
}Дополнительно
Собеседование включало блок лайвкодинга (задачи приложены в тексте), вопросы по управлению памятью, диспетчеризации методов, работе с UIKit и многопоточности.