Подтвердить что ты не робот

Отладка замыканий в Swift с помощью консоли Xcode LLDB

Я застрял с интересным поведением консоли отладки Xcode LLDB. Когда я использую оператор weak self + guard self для предотвращения утечек памяти, я сталкиваюсь со странным поведением при отладке своего кода при попытке напечатать параметр закрытия (например, ответ в примере) или что-либо свойство класса/структуры из закрытия. Это пример закрытия, и строка с оператором print имеет точку останова, на которой я пытаюсь напечатать параметр ответа из консоли Xcode.

Alamofire.request(url).responseJSON { [weak self] response in
    guard let self = self else { return }
    print("This line has a breakpoint and I am trying to print response from debug console")
}

Я пытаюсь использовать такие команды:

po response
p response
print response
e response
expression response

И всегда я получаю такую ошибку:

    (lldb) po response
error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it
    var $__lldb_error_result = __lldb_tmp_error
    ~~~~^~~~~~~~~~~~~~~~~~~~
    _

error: <EXPR>:18:5: error: value of type 'APIManager' has no member '$__lldb_wrapped_expr_25'
    $__lldb_injected_self.$__lldb_wrapped_expr_25(     
    ^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~

Вы тоже застряли с этой проблемой? Почему я получаю эту ошибку и какие возможные обходные пути, кроме удаления оператора weak self + guard self или вставки print(response) в код закрытия?

Временное решение:

Не используйте самозатенение, вместо этого используйте имя переменной примерно так _self, тогда вы не получите ошибок lldb, как указано выше:

Alamofire.request(url).responseJSON { [weak self] response in
    guard let _self = self else { return }
    // your code here ...
}

Или используйте команду v LLDB вместо po. Команда v имеет немного другое форматирование вывода, но она должна показывать вам необходимую информацию в большинстве случаев.

4b9b3361