1. Задача: Найти и исправить ошибки в функции compareContainerValue, позволив реализовать сравнение.
protocol Weapon {
associatedtype Kind: Equatable
func getKind() -> Kind
}
func compareContainerValue<C1: Weapon, C2: Weapon>(container1: C1, container2: C2) -> Bool where C1.Kind == C2.Kind {
return container1.getKind() == container2.getKind()
}Написать реализацию оператора нилового коалесцирования (??).
infix operator ??
func ??<T>(optional: Optional<T>, defaultValue: @autoclosure () -> T) -> T {
switch optional {
case .none:
return defaultValue()
case .value(let value):
return value
}
}Что будет, если запустить цикл с append в массив?
Происходит многократное увеличение размера массива (ресайзинг). При достижении емкости создается новый массив большего размера, и все элементы копируются в него. Это может привести к ошибкам нехватки памяти (out of memory).
Реализовать функционал compactMap для массива опциональных Int без использования функций высшего порядка.
extension Array where Element == Int? {
func compactMapForInt() -> [Int] {
var result: [Int] = []
for i in self {
if i != nil {
result.append(i!)
}
}
return result
}
}Что выведет print в примере с изменением массива внутри цикла for и почему?
123. Цикл for использует копию массива для итерации, поэтому изменения исходного массива внутри цикла не влияют на текущую итерацию.
Где и почему компилятор выведет ошибку в определении структур A, B, C?
В структуре C. Структуры не могут содержать внутри себя прямых или опциональных экземпляров самих себя, так как это приводит к бесконечной рекурсии при инициализации.
Что происходит в примере с замыканием и ссылками на объект класса C?
Выведет 2. Свойства strongValue и value указывают на один объект. После установки value?.text = 2, свойство объекта меняется. При установке value в nil, объект не деинитится, так как strongValue удерживает сильную ссылку. Замыкание выполняется, но text не меняется, так как value уже nil.
Что будет на экране и в консоли при изменении layer.bounds.size у UIView?
На экране будет красный квадрат 30×30, но frame самого UIView останется 100×100. Print выведет (100.0, 100.0, 100.0, 100.0).
Что выведет print(newView.frame) через 2.5 секунды анимации?
(100.0, 6000.0, 100.0, 100.0). Свойство frame меняется сразу на итоговое значение, несмотря на плавную анимацию представления.
Что выведет print(newView.frame) через 2.5 секунды, если вызвать sleep(10)?
Анимация заморозится на 10 секунд, затем продолжится и завершится мгновенно.
Какие методы существуют для обновления коллекции и как обновить её без анимации?
- collectionView.reloadSections(IndexSet(integer: 0)) — перезагрузка секции.
- CATransaction — для группировки операций.
- UIView.performWithoutAnimation { } — выполнение изменений мгновенно.
Что выведет и почему в примере с отложенным замыканием и деинициализацией?
Выведет "Hello my name is Bill" и "People deiniting". Экземпляр удерживается сильной ссылкой на self в замыкании, поэтому деинит происходит только после выполнения отложенного замыкания через 1 секунду.
Что будет при выполнении кода с DispatchQueues и как исправить ошибку?
Программа упадет из-за вызова serial.sync внутри той же последовательной очереди (deadlock). Исправление: не использовать sync на синхронной очереди.
Объяснить работу DispatchGroup, очередей и барьера в контексте потокобезопасности.
Барьер используется для обеспечения потокобезопасного доступа к ресурсу (например, счетчику) при конкурентном чтении и записи.
Дополнительно
Собеседование состояло исключительно из практических задач по Swift и iOS. Теоретических вопросов практически не было.
Вложения
[16afe798_Wildberries. Задачи.pdf](./media/16afe798_Wildberries. Задачи.pdf)