2017-07-05 7 views
1

私はSwiftを初めて使っていて、phpを通してサーバーから資格を取得するチュートリアル(かなり古い) JSONが返されますが、私はエラーAmbiguous reference to member jsonObject(with:options:)がjson varに残っています。私は検索し、さまざまなソリューションを適用しようとしていますが、無駄です。 :(jsonからデータを取得しようとしたときのメンバーjsonObject(with:options:) `へのあいまいな参照

はあなたの時間と助けてくれてありがとう

ここに私のコードです:。

let userEmail = userEmailTextField.text; 
let userPassword = userPasswordTextField.text; 

if((userEmail?.isEmpty)! || (userPassword?.isEmpty)!) { 
    displayMyAlertMessage(userMessage: "All Fields are required.") 
    return; 
} 

let myUrl = URL(string: "/UserLogin.php"); 
var request = URLRequest(url:myUrl!); 
request.httpMethod = "POST"; 
let postString = "email\(userEmail)&password=\(userPassword)"; 

request.httpBody = postString.data(using: String.Encoding.utf8); 

let task = URLSession.shared.dataTask(with: request as URLRequest) { 
data, URLResponse, error in 

    if error != nil { 
     //print = ("error=\(error)"); 
     return 
    } 

    var err: Error? 
    var json = JSONSerialization.jsonObject(with: data, options: .mutableContainers, error: &err) as? NSDictionary 

    if let parseJSON = json { 
     var resultValue:String = parseJSON["status"] as String!; 
     print("result: \(resultValue)") 


     if(resultValue == "Success") { 
      //Login Succesful 
      UserDefaults.standard.set(true, forKey:"isUserLoggedIn"); 
      UserDefaults.standard.synchronize(); 
      self.dismiss(animated: true, completion: nil); 

     } 
    } 
} 

task.resume() 
+0

エラーは、エラーパラメータを省略して、キャッチエラー処理を実装する必要があるということです。 URLRequestをURLRequestとしてキャストすることは意味がありません。 URLドメインとスキームを含めるのを忘れてしまった。 –

+0

jsonオブジェクトをSwiftネイティブ辞書 'に変換する必要がありますか? NSDictionaryを使用する代わりに[String:Any] 'を使用してください。 –

答えて

1

二つの大きな問題があります:

  1. は、実際のエラーがresponseために発生パラメーターが間違っています。タイプではなく、パラメーター・ラベル/変数でなければなりません。

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
    
  2. スイフト3を使用しているため、jsonObject(withにはerrorというパラメータはありません。方法はthrowですが、do - catchブロックが必要です。そして、いつものように、オプション.mutableContainersはSwiftではまったく役に立たない。パラメータを省略します。

    do { 
        if let parseJSON = try JSONSerialization.jsonObject(with: data) as? [String:Any], 
         let resultValue = parseJSON["status"] as? String { 
          print("result: ", resultValue) 
    
          if resultValue == "Success" { 
           //Login Succesful 
           UserDefaults.standard.set(true, forKey:"isUserLoggedIn") 
           self.dismiss(animated: true, completion: nil) 
          } 
        } 
    } catch { 
        print(error) 
    } 
    

他のいくつかの注意事項:

  • テキストフィールドをチェックするには、安全に、オプションの結合

    guard let userEmail = userEmailTextField.text, !userEmail.isEmpty, let userPassword = userPasswordTextField.text, !userPassword.isEmpty else { 
        displayMyAlertMessage(userMessage: "All Fields are required.") 
        return 
    } 
    
  • は、(例えば、resultValue用)let
  • として常にスウィフトの定数を宣言し使用します
  • を使用しないでくださいSwiftのネイティブタイプを使用します。
  • if前後の括弧は使用しないでください。後続のセミコロンは使用しないでください。彼らはスウィフトでは必要ない。
  • UserDefaults.standard.synchronize()も必要ありません。
  • String.Encoding.utf8をちょうど.utf8に減らすことができます。
+0

とてもわかりやすい答えをいただきありがとうございます。私が見つけたチュートリアルのほとんどすべてが古くなっています。Firebase認証ルートを使いましたが、この回答は将来の参照のために私は自分のデータベースにユーザーを持つ予定です。ありがとうございました!!! – Joshua

+0

信頼できない曖昧なチュートリアルを使用する前に、[Swift Language Guide](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/)を読んでください。 uid/TP40014097-CH5-ID309)。価値があります。 – vadian

関連する問題