簡體   English   中英

如何獲取在閉包中分配的變量的值(Swift)

[英]How to get the value of the variable that is assigned in a closure (Swift)

我正在Swift中使用Twitter REST API,並且試圖獲取在Twitter Request閉包內分配的變量的值,以便可以在閉包外使用該值。

我從Swift的Twitter REST API教程中獲得了此代碼,該教程位於: https : //dev.twitter.com/twitterkit/ios/access-rest-api

func jsonAvailable() -> Bool {
    // Swift
    let client = TWTRAPIClient()
    let statusesShowEndpoint = "https://api.twitter.com/1.1/statuses/show.json"
    let params = ["id": "20"]
    var clientError : NSError?

    var jsonAvailable: Bool = false
    let request = client.urlRequest(withMethod: "GET", url: 
    statusesShowEndpoint, parameters: params, error: &clientError)

    client.sendTwitterRequest(request) { (response, data, connectionError)-> Void in
    if connectionError != nil {
        print("Error: \(connectionError)")
    }

    do {
        let json = try JSONSerialization.jsonObject(with: data!, options: [])
        print("json: \(json)")
        jsonAvailable = true
    } catch let jsonError as NSError {
        print("json error: \(jsonError.localizedDescription)")
    }

    print("Value of jsonAvailable: \(jsonAvailable)")
    return jsonAvailable
    //always returns false, even if it is changed to true inside of the closure
}

在最后一行,即使在閉包內部將jsonAvailable更改為true,它也始終為false。 即使在sendTwitterRequest閉包內部進行了修改,如何在函數末尾獲取jsonAvailable的值?

我嘗試在單獨的函數中編寫此閉包,然后調用該函數以獲取值,但是由於這是一個自定義閉包,需要通過“ sendTwitterRequest”調用客戶端,因此我很難將所有這些必需的參數傳遞給適合API。

謝謝您的幫助!

您的關閉是異步的。 發生的事情是,在sendTwitterRequest將true分配給jsonAvailable之前,您遍歷了所有函數體,從而導致jsonAvailable為false。 您需要做的是擁有一個回調,如果需要的話,提供json狀態(或將json本身作為可設置對象)。

編輯 :您可能有這樣的事情

func jsonAvailable(callback: ((_ isJsonAvailable: Bool) -> Void)) {
    client.sendTwitterRequest(request) { (response, data, connectionError)-> Void in {
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: [])
            print("json: \(json)")
            callback(true)
        } catch let jsonError as NSError {
            print("json error: \(jsonError.localizedDescription)")
            callback(false)
        }
    }
}

jsonAvailable(callback: { (_ isJsonAvailable: Bool) in
    print(isJsonAvailable)
})

暫無
暫無

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

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