![](/img/trans.png)
[英]Swift 3.0 Error: Escaping closures can only capture inout parameters explicitly by value
[英]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.