在Swift闭包中使用[weak self]和赋值操作

4
我一直在尝试使用Swift,并将AFNetworking集成到一个项目中,但是有些代码让我不太满意。
我已经在苹果开发者论坛上发布了,但没有得到回复,所以我想把它带到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
        }
    }
}

当我需要改变selferrorstate变量时,在闭包中使用[weak self]if let语法的方式是否正确?我猜测是正确的,因为在闭包执行之前,self可能已经消失了。我不能使用self?.error = ...,因为那会导致编译错误。


没错,就是这样。如果你只是读取属性,可以使用可选链,但不能通过链式写入。 - David Berry
1个回答

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,在beta 5中似乎可以工作:
if var strongSelf = self {
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接