我有这些代码,显然有错误,因为当我在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
答案 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