每当我做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"])
}
}
}
}
答案 0 :(得分:1)
编译器是正确的 - 错误是可选的,但error.localizedDescription不是。您需要首先安全地解开错误
if let unwrappedError = error {
println(unwrappedError.localizedDescription)
}
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)
如果error
为nil
,则会崩溃,因此请谨慎使用!
语法。