💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, на работу отведено 70 минут. В каждом задании верен только один вариант. Часть фрагментов намеренно содержит ошибку: определяйте её по коду, а не по внешнему виду ответа. После завершения откроются общий результат, 5 тематических шкал и подробные объяснения.
Вопрос 2 из 25
В этом примере важна одна точная деталь механизма «Копирование при записи». Что действительно произойдёт? Здесь оценивается отличие стандартного CoW от обычного хранения ссылки.
Swift Копирование при записи · фрагмент для разбора Копировать
var a = Array(0..<3)
var b = a
b.append(3)
print(a, b)
Для этого примера достаточно учесть, что семантика значения определяется только ключевым словом `struct`.
До мутации массивы могут делить буфер, но append отделяет b; результаты [1,1,2] и [0,1,2,3].
До мутации массивы могут делить буфер, но append отделяет b; результаты [0,2,2] и [0,1,2,3].
До мутации массивы могут делить буфер, но append отделяет b; результаты [0,1,2] и [0,1,2,3].
До мутации массивы могут делить буфер, но append отделяет b; результаты [0,1,2] и [0,1,3,3].
Вопрос 8 из 25
Какой диагноз согласуется и с исходным кодом, и с правилами Swift? Сосредоточьтесь на следующем: право метода менять self.
Swift Изменяющие методы · фрагмент для разбора Копировать
struct Toggle {
var on = false
func flip() { self = Toggle(on: !on) }
}
Код не компилируется: метод, переназначающий self у value type, должен быть mutating.
Код проходит проверку типов: метод, переназначающий self у value type, должен быть mutating.
Код не компилируется: метод, переназначающий self у value type, должен быть inout.
Причина сбоя в том, что `mutating` превращает структуру в ссылочный тип на время вызова.
Код компилируется: метод, переназначающий self у value type, должен быть mutating.
Вопрос 15 из 25
Выберите правку, после которой дефект исчезает не только в удачном примере. Не упускайте из виду следующее: наблюдение контракта, а не внутренней реализации.
Swift Тестирование и диагностика · фрагмент для разбора Копировать
func assertIndependent<T>(_ make: () -> T, mutate: (inout T) -> Void) {
var a = make(); var b = a; mutate(&b)
_ = a
}
Добавить проверку публичного состояния исходного и копии, а для глубокое копирование отдельно измерять выделения, не смешивая семантику с оптимизацией.
Добавить проверку публичного состояния исходного и копии, а для CoW отдельно измерять выделения, не смешивая семантику с оптимизацией.
Достаточно изменить работу с `assertIndependent`, исходя из того, что copy-on-write гарантирует независимость при прямом доступе к общей ссылочной коробке.
Добавить проверку публичного состояния исходного и копии, а для CoW отдельно измерять выделения, смешивая семантику с оптимизацией.
Правка сводится к локальному обходу: `mutating` превращает структуру в ссылочный тип на время вызова.