2016-06-14 3 views
0

私の疑似質問は申し訳ありませんが、Swift開発の新機能です。 1(Xcodeの2.2.1で)私のプロジェクトが正常に構築されていますが、それを実行している間、私は次のコードで(LET要求ライン上で)エラーを取得しています: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がnilである可能性がありますか?もしそうなら、なぜそれが無限になるかもしれません。あるいは、pwdField.textがnilなので、もしそうなら、どうすればnilになるのでしょうか?どこが設定されていますか?なぜそれは価値を持っているのではないかというように。これらはあなた自身に尋ねることができ、あなたが試みるならあなた自身に答えることができるすべての質問です。それはデバッグです。 – Gruntcakes

+1

3つの無関係な観察:1. 'NSURLConnection'は廃止予定ですので、' NSURLSession'(またはSwift 3、 'URLSession')を使うべきです。 2. URLにパスワードを含めないでください。あなたは 'POST'リクエストを構築し、2つのパラメータをリクエストの本体に含めるべきです。あなたの最終的なサーバがHTTPSを使用すると仮定していますが、古いプロキシサーバがそれを取得する可能性があるため、機密情報をURLに入れないことをお勧めします。 3.電子メールアドレスとパスワードをエスケープするパーセント値でなければなりません。予約文字(特に '+'や '&')が含まれていると、これは失敗します。 – Rob

+0

ありがとうRob、NSURLSessionを使用します。私はあなたに言ったように、私は迅速な初心者ですので、アドバイスは歓迎以上です – tiamat

答えて

2

ここからは、アンラッピングのような任意の値が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もゼロ値でないかどうかを確認することもできます。これは次のようになります:

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

elseブロックでは、テキストを入力したり、他の処理を実行するようにユーザーに通知するロジックを追加できます。このhereについて詳しく読むことができます。

希望すると便利です。

+0

ダイツはそれを正しく持っていますが、私はあなたが!演算子(無条件にラップ解除するために)コンパイラは、これらの種類のエラーからあなたを守ります。 – Chadwick

+0

おかげさまで、このステートメントでうまくいきました。私はまた、電子メールとpwdフィールドのチェックを追加しました。 btw、私はこの構文に非常に驚いています。私はJavaに精通していて、コンパイラがこの状況をよりフレンドリーな方法で管理できると仮定しています。 – tiamat

+0

@tiamat私はこのパターンに慣れてきました。私はAndroid向けに開発を始めました。私はこれを行うことができませんでした。 :) – Lucas

0

問題は、おそらくあなたの2つのテキストフィールドのtext性質がoptionalsであり、したがってOptional("[email protected]")Optional("password")としてあなたURLに追加されているので、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)")!) 
関連する問題