【问题标题】:returning variables in a function swift在函数中快速返回变量
【发布时间】:2020-06-07 22:28:56
【问题描述】:

我将进行登录,并且发布请求在函数中。 在 if 语句 if dict!["Authorized"] as AnyObject? === true as AnyObject 中,如果授权为真,我想返回。 但是想要返回时的错误是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 {


        }
    }
}

【问题讨论】:

  • 为什么不对错误使用throw?而且,你不能 return 异步调用的结果。

标签: swift


【解决方案1】:

问题在于,在函数中的某一点您只有return,而在函数的另一点您只有return true。 Swift 是强类型的,一个函数总是必须返回相同的类型——你不能在一种情况下返回 bool 而在另一种情况下什么也不返回。您可能想要做的是将第一个 return 更改为 return false,然后将 -> Bool 添加到函数的签名中。另一种选择是返回一个可选的 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 {


        }
    }
}

【讨论】:

  • 你也可以throw报错。或返回Result
猜你喜欢
  • 2017-12-15
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多