Swift 4: выходящие замыкания могут фиксировать только входные параметры по значению - PullRequest
0 голосов
/ 11 мая 2018

Я перенес свой код из Swift 2 в Swift 4. У меня есть следующий код, который отлично работал в Swift 2:

func fetchUserThumbnailAvatar(_ task : inout URLSessionTask?, completion : @escaping (_ image : UIImage?) -> ()) {
    fetchUserAvatar(Session.currentUser?.avatar?.thumbnailURL as URL? ?? URL(string:"")!, externalUrl: URL(string: thumbnailAvatar) ?? URL(string:"")!, &task, completion: completion)
}

fileprivate func fetchUserAvatar(_ internalUrl : URL, externalUrl : URL,_ task : inout URLSessionTask?, completion : @escaping (_ image : UIImage?) -> ()) {
    fetchImage(externalUrl, task: &task, completion: { image in
        if image == nil {
            self.fetchImage(internalUrl, task: &task, completion: completion)
        } else {
            self.cache.removeObject(forKey: (internalUrl.path as AnyObject?)! )
            completion(image)
        }
    })
}

Однако после преобразования я получаю следующую ошибку:

Выходящие замыкания могут фиксировать входные параметры только явно по значению

в строке:

if image == nil {
            self.fetchImage(internalUrl, task: &task, completion: completion)
        }

Было бы здорово, если бы кто-то мог мне помочь.Спасибо.

1 Ответ

0 голосов
/ 11 мая 2018

Ошибка подробно описана в этом ответе .

Проблема с вашим кодом в том, что первое закрытие

fileprivate func fetchUserAvatar(_ internalUrl : URL, externalUrl : URL,_ task : inout URLSessionTask?, completion : @escaping (_ image : UIImage?) -> ()) {
    fetchImage(externalUrl, task: &task, completion: { image in // <-- HERE --
        if image == nil {

- выход из закрытия. Так что когда код

        if image == nil {
            self.fetchImage(internalUrl, task: &task, completion: completion) // <-- HERE --
        } else {

пытается записать в переменную task, исходный вызов fetchUserAvatar уже завершен.

Примечание: Я написал подобные комментарии <-- HERE -- в отрывки, чтобы уточнить, о какой строке я говорю. Также, пожалуйста, обязательно ознакомьтесь с ответом, который я привел выше, потому что он все прояснит.

Плохая новость заключается в том, что вам придется немного реорганизовать код, чтобы исправить ошибку. Для этого вам нужно будет изменить сигнатуры как fetchUserThumbnailAvatar, так и fetchUserAvatar, и это сломает вызывающих абонентов; поэтому абоненты также должны быть изменены. Поэтому я не могу исправить это для вас, потому что исправление зависит от кода, которого у меня нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...