簡體   English   中英

Swift 4:轉義的閉包只能按值顯式捕獲inout參數

[英]Swift 4: Escaping closures can only capture inout parameters explicitly by value

我一直在將代碼從Swift 2遷移到Swift4。下面的代碼在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)
        }
    })
}

但是,轉換后出現以下錯誤:

轉義的閉包只能按值顯式捕獲inout參數

在行:

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

如果有人可以幫助我,那將是很棒的。 謝謝。

答案中將詳細描述該錯誤。

您的代碼的問題是第一個閉包

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是什么,以及這將打破呼叫者; 因此呼叫者也必須更改。 因此,我無法為您修復此問題,因為此修復取決於我沒有的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM