为什么NSError的localizedDescription说Optional(“description”)?

时间:2015-07-11 17:04:17

标签: string swift optional nserror

每当我做println(error.localizedDescription)时,我会得到一些说法:

  

可选(“此处错误描述”)

而不仅仅是:

  

“错误描述”

如何摆脱描述的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"])
                }
            }

        }
    }

2 个答案:

答案 0 :(得分: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

将导致'描述'如果可选的错误可以解包,或者可能是'nil'那么可以成为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()

答案 1 :(得分:0)

您必须使用error打开?

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

如果您之前的检查已经知道error不是nil,您可以强制解包:

println(error!.localizedDescription) 

如果errornil,则会崩溃,因此请谨慎使用!语法。