簡體   English   中英

Swift:轉義閉包捕獲非轉義參數“onCompletion”

[英]Swift: Escaping closure captures non-escaping parameter 'onCompletion'

我的 swift 有問題。 我正在嘗試發送 API 請求,然后檢索數據,但收到以下錯誤消息:

“Swift:轉義閉包捕獲非轉義參數‘onCompletion’”。 有誰知道我該如何解決這個問題? 提前致謝

代碼:


class RestApiManager: NSObject {
    static let sharedInstance = RestApiManager()

    let baseURL = "http://api.randomuser.me/"

    func getRandomUser(onCompletion : (JSON) -> Void) {
        makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
            onCompletion(json)
        })
    }

    func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse) {
        let request = NSMutableURLRequest(url : URL(string: path)! as URL)

        let session = URLSession.shared

        let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
            let json:JSON = JSON(data as Any)
            onCompletion(json, error as NSError?)
        })
        task.resume()

    }
}

您必須用@escaping標記兩個完成處理程序。 通常編譯器會提供修復

class RestApiManager: NSObject {
    static let sharedInstance = RestApiManager()

    let baseURL = "http://api.randomuser.me/"

    func getRandomUser(onCompletion : @escaping (JSON) -> Void) {
        makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
            onCompletion(json)
        })
    }

    func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse) {
        let request = NSMutableURLRequest(url : URL(string: path)! as URL)

        let session = URLSession.shared

        let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
            let json:JSON = JSON(data as Any)
            onCompletion(json, error as NSError?)
        })
        task.resume()

    }
}

用這個:

class RestApiManager: NSObject {
static let sharedInstance = RestApiManager()

let baseURL = "http://api.randomuser.me/"

func getRandomUser(onCompletion : @escaping (JSON) -> Void) {
    makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
        onCompletion(json)
    })
}

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse) {
    let request = NSMutableURLRequest(url : URL(string: path)! as URL)

    let session = URLSession.shared

    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
        let json:JSON = JSON(data as Any)
        onCompletion(json, error as NSError?)
    })
    task.resume()

}
}

這是由於您的參數 onCompletion 而發生的。 默認情況下它是@nonesacping,您必須將其標記為@esacping,以便它可以在completionHandler 閉包中工作。

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)

這里的答案是在完成處理程序參數聲明之前添加 @escaping 是正確的,盡管簡短地解釋了。

這是我從Swift 的文檔中獲取的完整圖片所缺少 的內容

轉義閉包

當閉包作為參數傳遞給函數時,閉包被稱為對函數進行轉義,但在函數返回后被調用。 當您聲明一個將閉包作為其參數之一的函數時,您可以在參數類型前寫上@escaping 以指示允許閉包轉義。

所以基本上,如果你想在方法返回調用一個完成處理程序,它被定義為 swift 中的escaping ,並且應該這樣聲明:

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)

暫無
暫無

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

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