Быстрое значение захвата с тем же именем

В закрытии мы можем как-то использовать то же имя внутри, а также значение, захваченное закрытием.

func load(withResource resource: Resource) {
    var data: A?
    var error: Error?

    load(resource: resource) { (result, error) in
        data = result // Ok!
        error = error // error!
    }

    print("data: \(data), error: \(error)")
}

Я думаю, если есть что-то вроде использования self если мы говорили о сохраненных свойствах, но эти переменные объявляются в области действия функции.

Самый простой способ - просто переименовать error но мне было интересно, есть ли другой путь.

1 ответ

Решение

Во-первых, если ваш метод загрузки асинхронный, ошибка и данные всегда будут равны нулю при печати.

Прямой ответ на ваш вопрос заключается в том, что в рамках замыкания значение "error" - это значение параметра, и нет возможности получить доступ к ошибке из функции.

Очевидно, есть много вариантов, чтобы обойти это, но один чистый вариант - сделать вашу информацию в кортеж:

func load(withResource resource: Resource) {

    var closureData: (data: A?, error: Error?)?

    load(resource: resource) { (result, error) in
       closureData = (result, error)
    }

    //print(closureData) if you don't need to format it)
    print("data: \(closureData.data), error: \(closureData.error)")
}
Другие вопросы по тегам