2014-06-09 28 views
4

我一直在玩Swift,並將AFNetworking集成到一個項目中,並得到了一些我並不特別滿意的代碼。在Swift中使用[weak self]和賦值

有在蘋果開發論壇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 
     } 
    } 
} 

是與if let語法正確的,當我需要的突變的selferror變量state沿封閉使用[weak self]的這種方式?我猜這是因爲self可能在關閉執行前消失了。我不能使用self?.error = ...,因爲這會導致編譯器錯誤。

+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 { 
    // ... 
} 
相關問題