将值从闭包赋值给变量 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? [复制]