2016-06-14 90 views
0

对不起我的虚拟问题,但我是新的Swift开发,我有一个Swift 1.1项目工作正常,但升级到Xcode后为7.3。 1(和Xcode 2.2.1)我的项目是成功建立,但同时用下面的代码运行它(在令请求线),我得到一个错误:Swift 2.2:致命错误:意外地发现零,同时展开一个可选值

// 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)") 

的错误是:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) fatal error: unexpectedly found nil while unwrapping an Optional value

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

感谢您的帮助。

+3

您可以通过调试解决它。首先找出什么是零,请求?如果是这样,为什么它可能是零。可能是因为emailField.text是零?如果是这样,为什么这可能是零,在哪里以及如何设置?或者,也许是因为pwdField.text是零,如果是这怎么可能是零?它在哪里设置?它为什么没有价值等等。这些都是你可以问问自己的问题,如果你尝试,可以回答自己。这是调试。 – Gruntcakes

+1

三个无关的观察:1.现在不推荐使用'NSURLConnection',所以你现在应该使用'NSURLSession'(或者在Swift 3中,'URLSession')。 2.你不应该在URL中包含密码。你应该建立一个POST请求并在请求的主体中包含这两个参数。我假设您的最终服务器将采用HTTPS,但无论建议不要将敏感信息放入URL中,因为一些旧的代理服务器可能会捕获这些信息。你应该百分比转义电子邮件地址和密码。如果它们包含保留字符(特别是'+'或'&'),将会失败。 – Rob

+0

感谢罗布,我将使用NSURLSession。正如我告诉你的,我是一个快速入门的初学者,所以任何建议都非常值得欢迎 – tiamat

回答

2

从这里看起来像你打开一个可选的值是零。试试这个:

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是否也不是零值。它看起来像这样:

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

在else块中,您可以添加逻辑来通知用户输入文本或执行其他操作。你可以阅读更多关于这个here

希望这会有所帮助!

+0

Dilts已经说得对,但我会补充一点,如果你避免使用!运算符(无条件解包)编译器将保护您免受这些类型的错误。 – Chadwick

+0

谢谢Dilts,你说得对,它可以正常使用这个声明谢谢!我还添加了电子邮件和密码字段的检查。顺便说一句,我很惊讶这个语法,我更熟悉Java,并且我认为编译器可以以更友好的方式管理这种情况.... – tiamat

+0

@tiamat我已经习惯了这种模式,当我开始为Android开发,我错过了能够做到这一点。 :) – Lucas

0

的问题是可能的事实是,你们两个文本字段的text性能自选,因此被添加到您的网址为Optional("[email protected]")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)")!) 
相关问题