Выбор ответа Senior Замыкания и захват обновлено
Escaping-замыкание и mutating self
Вопрос
Почему в mutating func load() структуры нельзя передать escaping-замыкание, которое меняет self.items?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: self в mutating-методе это inout, и escaping-замыкание его не захватит. mutating передаёт self как inout, а inout-значение живёт только до конца вызова.
Варианты ответа
selfв mutating-методе это inout, и escaping-замыкание его не захватитправильный ответ- Структуры не могут хранить массивы, захваченные escaping-замыканием
- Escaping-замыкания в структурах запрещены полностью, только в классах
- Пометить
itemsкакlazy, тогда замыкание сможет его менять
Разбор
mutating передаёт self как inout, а inout-значение живёт только до конца вызова. Escaping-замыкание выполнится позже, когда менять уже нечего. Компилятор выдаёт ошибку «escaping closure captures mutating self». Решения: сделать модель классом (часто view model), или вернуть результат через async и присвоить его в месте вызова. Escaping-замыкания в структурах разрешены, если не захватывают изменяемый self.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Замыкания и захват»
- Зачем нужен @autoclosure
- Захват переменной замыканием в Swift
- Список захвата замыкания
- Сокращённый синтаксис замыканий в Swift
- Паттерн weak self в замыкании
- Неявный self в escaping-замыкании
- Задача на Swift: debounce для поиска
- Задача на Swift: сортировка контактов по нескольким полям