2014-12-18 60 views
2

我是obj c/swift的新手,并试图连接到RESTful api,并在此时出现“意外发现零,同时解包可选值”的致命错误:有问题发出HTTP请求和简单的认证快速

var request = NSURLRequest(URL: url!) 

我正在使用此示例来完成任务 - https://stackoverflow.com/a/24495548/4375598。我正尝试使用用户名和密码登录到URL中具有私有api_key的应用程序。

import UIKit 

class ViewController: UIViewController, NSURLConnectionDataDelegate { 

@IBOutlet weak var usernameTextField: UITextField! 
@IBOutlet weak var passwordTextField: UITextField! 


@IBAction func signInButton(sender: AnyObject) { 
    var url = NSURL(string: "MY URL") 
    var request = NSURLRequest(URL: url!) 
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: true) 

} 

func connection(connection: NSURLConnection, willSendRequestForAuthenticationChallenge challenge: NSURLAuthenticationChallenge!) { 
    if challenge.previousFailureCount > 1 { 

    } else { 
     let creds = NSURLCredential(user: usernameTextField.text, password: passwordTextField.text, persistence: NSURLCredentialPersistence.None) 
     challenge.sender.useCredential(creds, forAuthenticationChallenge: challenge) 
    } 
} 

func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse) { 
    let status = (response as NSHTTPURLResponse).statusCode 
    println("status code is \(status)") 
} 

回答

0

您使用的URL("MY URL")应该格式化良好,并且根据Apple的规定,遵守RFC2396

如果URL格式不正确NSURL将返回nil。下一行将失败,因为您要强制解包url变量(感叹号(!)的用途)。如果你做一个被迫展开对被设置为nil,像NSURLRequest一个变量,您的应用程序会崩溃在运行时返回“意外发现零而展开的可选值”,如果你婉检查变量是否正确

初始化并没有设置为nil,你可以做到以下几点:

if let url = NSURL(string: "MY URL") { 
    var request = NSURLRequest(URL: url!) 
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: true) 
} 
else { 
    println("url is set to nil) 
} 

要立即解决您的问题,请确保您的URL格式完全

0

我假设你有一个实际的URL,你传递给你的NSURL初始值设定项?你强制解开那个可能是“意外发现的nil”错误的原因,因为NSURL的初始化器可能会失败。如果有效,使用if let绑定解开可选项。