Выбор ответа Senior Замыкания и захват обновлено

Escaping-замыкание и mutating self

Вопрос

Почему в mutating func load() структуры нельзя передать escaping-замыкание, которое меняет self.items?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: self в mutating-методе это inout, и escaping-замыкание его не захватит. mutating передаёт self как inout, а inout-значение живёт только до конца вызова.

Варианты ответа

  1. self в mutating-методе это inout, и escaping-замыкание его не захватитправильный ответ
  2. Структуры не могут хранить массивы, захваченные escaping-замыканием
  3. Escaping-замыкания в структурах запрещены полностью, только в классах
  4. Пометить items как lazy, тогда замыкание сможет его менять

Разбор

mutating передаёт self как inout, а inout-значение живёт только до конца вызова. Escaping-замыкание выполнится позже, когда менять уже нечего. Компилятор выдаёт ошибку «escaping closure captures mutating self». Решения: сделать модель классом (часто view model), или вернуть результат через async и присвоить его в месте вызова. Escaping-замыкания в структурах разрешены, если не захватывают изменяемый self.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.