2015-07-11 74 views
0

每當我做println(error.localizedDescription)我得到的東西,說:爲什麼NSError的localizedDescription說可選(「description」)?

可選( 「在這裏的錯誤的說明」)

而不是隻:

「錯誤的描述在這裏「

我該如何擺脫第Optional()部分描述?

我試過下面的方法,導致編譯器錯誤,說它不是可選的。

func performLoginRequestWithURL(url: NSURL, email: String, password: String) { 
     let bodyData = "email=\(email)&password=\(password)" 
     var request: NSMutableURLRequest = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "POST" 
     request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding) 
     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){ 
      response, data, error in 

      if let error = error { 
       let errString = error.localizedDescription 
       NSNotificationCenter.defaultCenter().postNotificationName(self.lh, object: nil, userInfo: ["Result": errString]) 

      } else if data != nil { 
       let json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 

       if let dictionary = JSON().parseJSON(json) as [String: AnyObject]? { 
        let accesstoken = dictionary["id"] as! String 
        let id = dictionary["userId"] as! Int 
        var results = [String: AnyObject]() 
        results = ["at": accesstoken, "id": id] 

        // MARK: - Store UID & AccessToken 
        NSUserDefaults.standardUserDefaults().setBool(true, forKey: "userLoggedIn") 
        NSUserDefaults.standardUserDefaults().setInteger(id, forKey: "userId") 
        NSUserDefaults.standardUserDefaults().setObject(accesstoken, forKey: "accessToken") 
        NSUserDefaults.standardUserDefaults().synchronize() 
        NSNotificationCenter.defaultCenter().postNotificationName(self.lh, object: nil, userInfo: ["Result": "Success"]) 
       } 
      } 

     } 
    } 

回答

0

你必須使用?解開error

if let errString = error?.localizedDescription { 
    println(errString) 
} 

如果您已經從早期的檢查知道error是不是nil,你可以強制展開:

println(error!.localizedDescription) 

這將會崩潰,如果errornil,那麼請謹慎使用!語法。

+0

我已經在檢查裏看到錯誤是不是零,但它仍然堅持它不是可選的。所以這兩個選項都不起作用。錯誤說操作數應該是可選的類型。 –

+0

您使用的是哪個版本的Xcode? –

+0

我正在使用最新版本,6.4 –

1

編譯器是正確的 - 錯誤是可選的,但error.localizedDescription不是。您可能需要通過

if let unwrappedError = error { 
    println(unwrappedError.localizedDescription) 
} 

或先拆開包裝錯誤,安全:使用另購的鏈接 - https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

let description = error?.localizedDescription 

這要麼因「說明」是localizedDescription的字符串,如果錯誤可選可以成功解包,或者如果不是,則可能'無'。

從示例中添加的代碼添加到問題中。似乎可以正常工作,下面的代碼可以複製到遊樂場來顯示錯誤和數據字符串打印輸出 - 只需添加有效的http://地址即可查看有效的返回信息,或嘗試使用「http:」來獲取錯誤。

import UIKit 
import XCPlayground 

func performLoginRequestWithURL(url: NSURL) { 
    let request: NSMutableURLRequest = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){ 
     response, data, error in 

     if let error = error { 

      let errString = error.localizedDescription 

      print(errString) 

     } else if data != nil { 

      let json = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String 

      print(json) 
     } 
    } 
} 

performLoginRequestWithURL(NSURL(string:"http:")!) 

XCPSetExecutionShouldContinueIndefinitely() 
+0

我已經嘗試過使用該部分,如果發生錯誤=錯誤{...}(請參閱上文)。這就是它現在的樣子,這就是error.localizedDescription出現錯誤的地方。 –

+0

這個NSError是從哪個類生成的? –

+0

從NSURLConnection,它是一個到遠程服務器的POST請求。 –

相關問題