使用Swift闭包来捕获变量

时间:2015-10-10 06:23:11

标签: ios swift closures

我有这些代码,显然有错误,因为当我在return语句中使用FOO时,它超出了函数的范围。我知道(我想我知道)我需要使用闭包来捕获变量,但我无法弄清楚如何做到这一点。使用Alamofire& SwiftyJSON。任何帮助都会很棒!谢谢!

  func getPlayerID(named: String) -> String {

    Alamofire.request(.GET, "URL", headers: headers)
        .responseJSON { response in


        let json = JSON.self(response.result.value!)

        for var index = 0; index < json.count; index++ {
            if json[index]["Name"].stringValue == named {
                var FOO = json[index]["FOO"].stringValue
            } // If Statement End
        } // For Loop End
    } // Alamofire Request End

     // Return Statement for getPLayerID Function

        return FOO

} // getPlayerID Function End
} // Player Struct End

1 个答案:

答案 0 :(得分:1)

基本的想法是getPlayerID不应该返回任何内容,而应该只有一个参数是一个闭包,一旦你检索到你想要的值,然后回复&#34;使用该值作为参数的闭包。

但是,我建议在这里进行各种其他改进:

  • 构建字符串数组并返回
  • 检查result是否为.Failure,因为您无法控制可能出现的各种服务器/网络问题
  • 更改闭包以检测并报告错误

但希望这说明了基本的想法:

就个人而言,我(a)将String参数设为completionHandler可选项; (b)添加另一个可选的错误参数; (c)将错误处理添加到getPlayerID

func getPlayerID(completionHandler: ([String]?, ErrorType?) -> Void) {
    Alamofire.request(.GET, "URL", headers: headers)
        .responseJSON { request, response, result in
            switch (result) {
            case .Success(let value):
                let json = JSON.self(value)

                // variable to hold all of the results

                var strings = [String]()   

                // populate the array of strings

                for var index = 0; index < json.count; index++ {
                    if json[index]["Name"].stringValue == named {
                        strings.append(json[index]["FOO"].stringValue)
                    }
                }

                // call the completion handler with the strings

                completionHandler(strings, nil)
            case .Failure(_, let error):
                completionHandler(nil, error)
            }
    }
}

然后,当你想要打电话时:

getPlayerID() { strings, error in
    // use `strings` here
}

// but not here