Переменная закрытия не сохраняется, если не используется во внутренней области видимости в Swift? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть функция, подобная приведенной ниже:

func fetchComment(postId: String, index: Int, callback: @escaping (_ comment: Comment) -> Void) {
    rtDB!.fetchComment(postId: postId, callback: { comment in
        self.log.debug("postId: \(postId) - comment: \(comment)")
        self.fetchUsersForComments([postId: comment], callback: { usersList in
            // self.log.debug("++++  postId: \(postId) - comment: \(comment)")    // 1
            self.log.debug("postId: \(postId) - usersList: \(usersList)")
        })
    })
}

Если я добавлю точку останова на 1 с этой закомментированной строкой и выведу p comment, я получу сообщение с неопределенным идентификатором comment.Но comment передается как аргумент закрытия в метод fetchComment.Однако, если я раскомментирую строку, помеченную 1, которая использует переменную comment, а затем выведу p comment с точкой останова, она будет работать нормально.Почему переменная comment не определена, если она не используется во внутренней области видимости?Компилятор Swift выполняет оптимизацию и удаляет переменную?У меня не включена оптимизация для отладки.

1 Ответ

0 голосов
/ 26 февраля 2019

Причина, по которой вы не можете напечатать comment, когда строка не закомментирована, заключается в том, что вы находитесь в области действия замыкания, а замыкания по умолчанию ничего не фиксируют.Это как если бы вы использовали другой отдельный метод.

Когда вы раскомментируете строку, вы теперь используете переменную comment внутри замыкания.Это означает, что закрытие должно захватить это.В контексте аналогии с «отдельным методом» это похоже на то, что отдельный метод принимает дополнительный параметр, называемый comment.

Подробнее здесь

...