首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Swift闭包捕获变量

使用Swift闭包捕获变量
EN

Stack Overflow用户
提问于 2015-10-10 06:23:11
回答 2查看 848关注 0票数 1

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

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-10 06:43:33

基本思想是,getPlayerID不应该返回任何东西,而是应该有一个参数,它是一个闭包,一旦检索到要“返回”的值,就可以使用该值作为参数调用闭包。

但是,我建议在这里做其他的改进:

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

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

就我个人而言,我会(a)使String参数成为completionHandler的可选参数;(b)添加另一个可选的错误参数;(c)向getPlayerID添加错误处理

代码语言:javascript
复制
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)
            }
    }
}

然后,当你想叫它时:

代码语言:javascript
复制
getPlayerID() { strings, error in
    // use `strings` here
}

// but not here
票数 1
EN

Stack Overflow用户

发布于 2015-10-10 06:52:06

如果发出异步请求,则无法返回在同一函数中响应而收到的值,因为需要时间通过网络将请求发送到服务器并返回。解决这个问题的最好方法是向函数中添加回调参数,而不是返回值。

代码语言:javascript
复制
func getPlayerID(named: String, callback:(foo: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
                    callback(foo: FOO)   // you fire callback here..
                } // If Statement End
            } // For Loop End
    } // Alamofire Request End

} // getPlayerID Function End

回调是一个块对象,它将在收到响应时触发。因此,如果没有响应(例如,互联网连接中断),回调就永远不会启动。如何使用这个示例:

代码语言:javascript
复制
self.getPlayerID("ototo") { (foo) -> () in
    print("foo received = \(foo)")
}

此外,在发送请求和接收响应之间也有一段时间跨度。因此,在应用程序的UI中添加UIActivityIndicatorView是一个很好的做法,直到响应到达为止(如果internet连接突然中断,则处理超时)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33050994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档