在Swift闭包中使用[弱自我]和赋值

时间:2014-06-09 18:14:39

标签: ios closures swift

我一直在玩Swift并将AFNetworking集成到一个项目中并获得了一些我并不特别满意的代码。

在Apple开发论坛上有already posted并且没有得到回复,我以为我会把它带到SO ...

我的类强烈引用AFHTTPSessionManager实例,以下代码段是调用GET(_, parameters, success, failure)方法时使用的闭包。

let failure = { [weak self] (task: NSURLSessionDataTask!, error: NSError!) -> (Void) in
    if error?.userInfo[AFNetworkingOperationFailingURLResponseErrorKey]?.statusCode == 401 {
        if let weakSelf = self {
            weakSelf.error = NSError(domain: MyConnectionErrorDomain, code: ErrorCode.InvalidCredentials.toRaw(), userInfo: nil)
            weakSelf.state = .Error
        }
    }
}

当我需要改变[weak self]的{​​{1}}和if let变量时,这种方式在闭包中使用error以及state语法是否正确?我猜测在关闭执行之前,self可能已经消失了。我无法使用self,因为这会产生编译错误。

1 个答案:

答案 0 :(得分:3)

使用Xcode 6 beta 5,您现在可以do assignments via optional chaining。您甚至可以通过检查赋值的返回值来检查赋值是否完成:

if (self?.error = NSError(domain: MyConnectionErrorDomain, code: ErrorCode.InvalidCredentials.toRaw(), userInfo: nil)) == nil {
    // `self` became nil in the meantime
}

更新:我刚刚尝试了可选绑定if var,它确实可以在测试版5中运行:

if var strongSelf = self {
    // ...
}