从'String?'演员到不相关的类型'[String:String]'总是失败

问题描述 投票:0回答:2

我试图通过使用带有标识符的segue将LogInViewController切换到主屏幕,然后从我从数据库返回的json响应中选择一个键。我没有错误,但有警告说

“从'String'中演员?到不相关的类型'[String:String]'总是失败“

我相信这是问题所在。

单击登录按钮后的日志说明:

"Result: SUCCESS
{"status":true,"message":"Successful Login"}  
{"user":{"userID":3,"email":"becky1","Final-Score":1,"Game-Reminder":1,"Stat-Update":0,"Game-Start":0}}"

我的完整代码:

import UIKit
import Alamofire
import GoogleSignIn
import SwiftyJSON

class LogInViewController: UIViewController,GIDSignInUIDelegate, GIDSignInDelegate {
    @IBOutlet weak var lblTitle: UILabel!
    @IBOutlet weak var btnGoogleSignIn:UIButton!

    //you can get the ip using ifconfig command in terminal
    let URL_USER_LOGIN = "http://cgi.sice.indiana.edu/~team58/login.php"

    let defaultValues = UserDefaults.standard

    @IBOutlet weak var textFieldEmail: UITextField!
    @IBOutlet weak var textFieldPassword: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()
        ///Google Sign in////
        btnGoogleSignIn.addTarget(self, action: #selector(signinUserUsingGoogle(_:)), for: .touchUpInside)
        // Do any additional setup after loading the view, typically from a nib.

    }

    @objc func signinUserUsingGoogle(_ sender: UIButton) {
        if btnGoogleSignIn.title(for: .normal) == "Sign Out" {
            GIDSignIn.sharedInstance().signOut()
            lblTitle.text = ""
            btnGoogleSignIn.setTitle("Sign in Google", for: .normal)
        } else {

            GIDSignIn.sharedInstance().delegate = self
            GIDSignIn.sharedInstance().uiDelegate = self
            GIDSignIn.sharedInstance().signIn()



        }

    }

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
            print("We have error signing in user == \(error.localizedDescription)")
        } else {
            performSegue(withIdentifier: "popOutNoteExpanded", sender: self)
            if let gmailUser = user {
                lblTitle.text = "You are signed in using id \(gmailUser.profile.email)"
                btnGoogleSignIn.setTitle("Sign Out", for: .normal)

                /// end google sign in ///
            }
        }
    }


    @IBAction func LoginButton(_ sender: UIButton) {
        let parameters: Parameters=[
            "email":textFieldEmail.text!,
            "password":textFieldPassword.text!
        ]

        //making a post request
        Alamofire.request(URL_USER_LOGIN, method: .post, parameters: parameters).responseString
            {
                response in

//                print("Request: \(String(describing: response.request))")   // original url request
//                print("Response: \(String(describing: response.response))") // http url response
                print("Result: \(response.result)")
                print(response.result.value!)

//
//                //self.ResponseLabel.text = "Result: \(response.result)"

                if let result = response.result.value as? [String:String] {



                    //if there is no error

//                    if result["SUCCESS"] {

                    if result["message"] == "Succesful Login" {



                        //getting the user from response

                        //getting user values - not neccesary
                        if let userEmail = result["email"] {
                           self.defaultValues.set(userEmail, forKey: "email")
                        }
                        if let userPassword = result["password"] {
                          self.defaultValues.set(userPassword, forKey: "password")
                        }
                        self.performSegue(withIdentifier: "popOutNoteExpanded", sender: self)




//
                        } else  {
                        //error message in case of invalid credential
                      // original url request
//                        print("Response: \(String(describing: response.response))") // http url response

                        print("invalid credentials")

                    }



}
}
}



}
swift
2个回答
1
投票

问题是response.result.value有可选的String类型。但你试图在这里施放像[String: String]的字典

 if let result = response.result.value as? [String:String] {

此代码安全地检查它,但转换显然失败。要解决此问题,您必须将incode字符串解析为json对象以便检索数据。

Swift 4使用Codable来完成这项工作。 Documentation或使用Alamofire API做同样的工作:这个方法responseJSON


0
投票

有很多方法可以将可选字符串转换为字典。

你可以使用原生的JSONSerialization

guard let text = response.result.value as? String else { return } 
    if let data = text.data(using: String.Encoding.utf8) {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:String]
            print(json) // safely use json
        } catch {
            print("Error")
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.