快速返回变量

时间:2020-06-07 22:28:56

标签: swift

我将进行登录,并且职位要求在函数中。 在if语句if dict!["Authorized"] as AnyObject? === true as AnyObject中,如果授权为true,我想返回。 但是要返回时的错误是Unexpected non-void return value in void function 我试图将func声明为Bool或任何其他类似-> Bool的语句。 但这不起作用。 这是我的代码。

func Login(Benutzer: String, Password: String) {


        var request = URLRequest(url: URL(string: "http://mydomain/ajax/login.php")!)
            request.httpMethod = "POST"
        let postString = "Benutzername=\(String(describing: Benutzer))&Password=\(String(describing: Password))"
            request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                  // check for fundamental networking error
            print("error=\(String(describing: error))")
            DispatchQueue.main.async {
        if error as AnyObject? === "The Internet is Down" as AnyObject {
            }
        else {
        let alert = UIAlertController(title: "Error", message: "You have to turn on your Internet or Server is Down ", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true)
            }

                }
                    return
                }
        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
                                }

            let responseString = String(data: data, encoding: .utf8)
                print("responseString = \(String(describing: responseString))")

        func convertToDictionary(text: String) -> [String: Any]? {
            if let data = text.data(using: .utf8) {
                do {
                    return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                } catch {
                    print(error.localizedDescription)
                        }
                            }
                               return nil
                           }

        let dict = convertToDictionary(text: responseString!)
            DispatchQueue.main.async {
                if dict!["Authorized"] as AnyObject? === true as AnyObject {

                    return true
                    // error is here

                }

            else {


                let alert = UIAlertController(title: "Error", message: dict!["Message"] as? String, preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                    self.present(alert, animated: true)
                        }
                    }
                }
                task.resume()

    }



    @IBAction func loginTapped(_ sender: Any) {

        let Benutzer = benutzernameTextField.text;
        let Password = passwordTextField.text;

        if benutzernameTextField.text == Benutzer && passwordTextField.text == Password {


        }
    }
}

1 个答案:

答案 0 :(得分:0)

问题是,在函数的某一点上您只有return,而在函数的另一点上您只有return true。 Swift是强类型的,函数始终必须返回相同的类型-在一种情况下不能返回布尔值,在另一种情况下不能返回布尔值。您可能想做的就是将第一个return更改为return false,然后将-> Bool添加到函数的签名中。另一种选择是返回可选的布尔值(-> Bool?),在第一种情况下返回nil。另外,作为一个旁注,您可能希望小写“登录”中的“ L”,这只是惯例。

func Login(Benutzer: String, Password: String) -> Bool {


        var request = URLRequest(url: URL(string: "http://mydomain/ajax/login.php")!)
            request.httpMethod = "POST"
        let postString = "Benutzername=\(String(describing: Benutzer))&Password=\(String(describing: Password))"
            request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                  // check for fundamental networking error
            print("error=\(String(describing: error))")
            DispatchQueue.main.async {
        if error as AnyObject? === "The Internet is Down" as AnyObject {
            }
        else {
        let alert = UIAlertController(title: "Error", message: "You have to turn on your Internet or Server is Down ", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true)
            }

                }
                    return false
                }
        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
                                }

            let responseString = String(data: data, encoding: .utf8)
                print("responseString = \(String(describing: responseString))")

        func convertToDictionary(text: String) -> [String: Any]? {
            if let data = text.data(using: .utf8) {
                do {
                    return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                } catch {
                    print(error.localizedDescription)
                        }
                            }
                               return nil
                           }

        let dict = convertToDictionary(text: responseString!)
            DispatchQueue.main.async {
                if dict!["Authorized"] as AnyObject? === true as AnyObject {

                    return true

                }

            else {


                let alert = UIAlertController(title: "Error", message: dict!["Message"] as? String, preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                    self.present(alert, animated: true)
                        }
                    }
                }
                task.resume()

    }



    @IBAction func loginTapped(_ sender: Any) {

        let Benutzer = benutzernameTextField.text;
        let Password = passwordTextField.text;

        if benutzernameTextField.text == Benutzer && passwordTextField.text == Password {


        }
    }
}