2016-06-14 32 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)")!) 
相關問題