将值从闭包赋值给变量 Swift

Posted

技术标签:

【中文标题】将值从闭包赋值给变量 Swift【英文标题】:Assign Value from Closure to Variable Swift 【发布时间】:2016-03-03 00:03:13 【问题描述】:

我正在尝试将从闭包返回的值分配给我在闭包范围之外分配的变量。

我想这样做,这样我就可以在我的闭包之外使用这个 var 以保持整洁,并且不会在这个闭包中包含所有这些嵌套代码。

我使用 Alamofire 处理请求,使用 swify-json 来帮助解析 json。

我得到以下信息:

Error: variable 'userId' captured by a closure before being initialized

这是我调用闭包函数的代码:

var userId: Int

get()

    data in
    userId = data["used_id"].intValue

这是我的 get() 函数的实现:

func get(param: [String: AnyObject] = [String: AnyObject](), completion: (JSON) -> ())

    Alamofire.request(.GET, "apiendpoint.com", parameters: param)
    .responseJSON
    
        response in
            switch response.result
            
                case .Success:
                    let jsonData = JSON(data: response.data!)
                    completion(jsonData)
                case .Failure(let error):
                    print("Request failed with error: \(error)")
            
    

感谢您的所有帮助!

【问题讨论】:

【参考方案1】:

var userId: Int 更改为var userId: Int!

原因是当你“捕获它”时,闭包期望变量中有一个值。通过使用强制解包变量,闭包将能够捕获它,因为它包含一个 nil 值,然后您可以在调用闭包时为其分配一个值。

【讨论】:

好吧,我已经走得更远了!它现在会构建,但是如果我尝试在闭包之外使用我的 var (userId),它会崩溃,因为它仍然是 nil。但是在闭包里面 userId 不是 nil,而是一个实际的值。 我假设您正在尝试像这样访问变量: var userId: Int! get() userId = ... print(userId) 如果是这样,则在调用 print(userId) 时,由于网络请求是异步的,因此网络请求实际上并未完成。调用 get() 后立即调用 print 显然没有足够的时间完成请求。解决这个问题的方法是对闭包本身的 userId 变量执行您想要执行的操作。另外,如果我提供的答案解决了您的问题,请勾选它作为正确答案。 好的,谢谢你的帮助。这有帮助,但我仍然想在我的闭包之外访问该变量,但我担心你的权利。在执行打印之前,异步请求未完成。谢谢你的帮助:) 你仍然可以在闭包之外访问你的变量,只要你知道你试图在哪里访问它只会在网络请求完成后被调用。在闭包(又名“完成处理程序”)中,您可以调用另一个函数,该函数将继续执行您想做的事情。

以上是关于将值从闭包赋值给变量 Swift的主要内容,如果未能解决你的问题,请参考以下文章

将值从 Objective-C 类传递给 Swift TableViewCell

如何在使用 Swift 关闭 ViewController 期间将值从 ViewController B 传递给 ViewController A? [复制]

如何将值从javascript变量传递给剃刀变量?

如何将值从javascript传递到iOS UIWebView

将值从数据库传递到 vue 组件并将其分配给变量

将值传递给模态 UIViewController - Swift