SWIFT:将变量从闭包传递给函数

时间:2015-08-18 02:49:31

标签: ios swift swift2

我试图创建一个返回NSDictionary的函数,而该函数又需要从闭包中返回。

我对Swift来说相对较新,我在解决这个问题时遇到了问题。 任何帮助将不胜感激。

// Takes a String, needs to return a NSDictionary

func login(action: String) -> NSDictionary 
{
    let command = NSURL(string: "\(connectionType)://\(url)/includes/api.php?username=\(username)&password=\(password)&accesskey=\(apiKey)&action=\(action)&responsetype=json")
    print(command!)

    let session = NSURLSession.sharedSession()

    // Get error here when changing Void > NSDictionary
    let task = session.dataTaskWithURL(command!) {
        (data, response, error) -> Void in 

        if error != nil {

            print(error!.localizedDescription)

        } else {

            do {
                let result = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary

                print(result) // Need this returned

            } catch {
                // handle error
                print(error)
            }
        }
    }

    task.resume()

    return result As! NSDictionary // returns empty, because of -> Void??

}

2 个答案:

答案 0 :(得分:2)

问题是dataTaskWithURL是一个异步函数,因此它在返回函数之前还没有执行该块。

您需要做的是设置一个可以在self上调用的函数,让self知道块何时执行并且可以将结果传递给您,或者设置一个带有委托你可以打电话通知结果

另外,块中的-> Void是块的返回类型,你不应该在该块内部返回任何内容,因为实际上没有任何内容会发生,因为父函数不期望返回任何内容,因此为什么Void

答案 1 :(得分:2)

在你的闭包类型声明中

let task = session.dataTaskWithURL(command!) {
    (data, response, error) -> Void in
    /* closure body */
}

Void更改为JSONObject。但那还不是全部!你试图从一个进行异步调用的登录函数返回一些东西,这是不可能的。相反,你的login函数本身需要一个闭包,那个闭包将是你用结果NSDictionary做某事的地方。因此,请将login的声明更改为

func login(action: String, completionHandler: (NSDictionary) -> ())

并相应地实施completionHandler