Swift 2.2:致命错误:在展开可选值

时间:2016-06-14 21:26:48

标签: ios xcode

很抱歉我的虚拟问题,但我是Swift开发的新手,我有一个关于Swift 1.1的项目,该项目工作正常但在升级到Xcode到7.3.1(使用Xcode 2.2.1)后,我的项目已成功构建但是我在使用以下代码运行它(在let请求行上)时遇到错误:

// Send HTTP GET Request

    let request = NSURLRequest(URL: NSURL(string: "http://11.22.33.44:8080/MySRV/login?email=\(emailField.text)&password=\(pwdField.text)")!)

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{
        (response: NSURLResponse?, data: NSData?, error: NSError?)-> Void in

        print("response \(response?.description)")

错误是:

  

线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)   致命错误:在解包可选值时意外发现nil

我可以想象我的请求是零,但我不知道如何解决它。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

从这里开始看起来你打开了一个nil的可选值。试试这个:

    if let url: NSURL = NSURL(string: "http://11.22.33.44:8080/MySRV/login?email=\(emailField.text)&password=\(pwdField.text)") {
        let request = NSURLRequest(URL: url)
        // Do asynchronous request here
    } else {
        // NSURL is incorrect
    }

这是您可以在Swift中安全地展开可选值的方法。您可能还想检查emailField.text和pwdField.text是否也不是nil值。它看起来像这样:

     if let email: String = emailField.text {
        // Text is not nil
     } else {
        // UITextField text is nil!
     }

在else块中,您可以添加逻辑以通知用户输入文本或执行其他操作。您可以阅读有关此here的更多信息。

希望这有帮助!

答案 1 :(得分:0)

问题可能是因为您的两个文本字段的text属性是选项,因此会以Optional("user@domain.com")Optional("password")的形式添加到您的网址中,因此,构建URL的尝试失败了。

您可以执行以下操作:

guard let email = emailField.text else {
    print("email is `nil`")
    return
}

guard let password = pwdField.text else {
    print("password is `nil`")
    return
}

let request = NSURLRequest(URL: NSURL(string: "http://11.22.33.44:8080/MySRV/login?email=\(email)&password=\(password)")!)