【问题标题】:Boolean function using switch statement in swift [duplicate]在swift中使用switch语句的布尔函数[重复]
【发布时间】:2018-12-23 12:51:03
【问题描述】:

我正在尝试使用 switch 语句获得布尔结果,但我猜我的代码有问题

class func login(username: String , password: String) -> Bool {
    let url = "http://127.0.0.1:3000/login/"+username+"/"+password
    Alamofire.request(url).responseJSON { response in
        switch response.result {
        case .failure:
            // print(error)
            return false
        case .success:
            // print(value)
            return true
        }
    }
}

【问题讨论】:

    标签: swift switch-statement


    【解决方案1】:

    您应该使用带有Bool 参数的完成处理程序,而不是返回值

    class func login(username : String , password : String, _ completion: @escaping (Bool) -> ())
    

    现在您可以像这样调用完成(也可以通过声明 errorvalue 来修复案例)

    switch response.result {
    case .failure(let error):
        //print(error)
        completion(false)
    case .success(let value):
        //print (value)
        completion(true)
    }
    

    然后您可以在调用完成时访问其闭包内的Bool 参数。

    Foo.login(username: "", password: "") { success in 
        // print(success)
        ...
    }
    

    【讨论】:

    • 这是我第一次使用完成处理程序所以我不明白如何使用它我想调用我的函数登录所以如果结果为真我可以传递到下一个视图控制器
    • @LouayBaccary 关闭而不是我的点传递类似if success { and here you can present next ViewController }
    • 我试过这段代码,但没有用 API.login(username: textUsername.text!, password: textPassword.text!) { success in print("Welcome") }
    • @LouayBaccary 和你在 switch 中调用 completion(true)completion(false) 吗?
    • 这是代码切换 response.result { case .failure: //print(error) completion(false) case .success: //print (value) completion(true) }
    【解决方案2】:
    typealias CompletionClosure = (Bool) -> Void
    class func login(username : String , password : String, completionHandler: @escaping CompletionClosure)   {
            let url = "http://127.0.0.1:3000/login/"+username+"/"+password
            Alamofire.request(url).responseJSON{response in
            switch response.result
                  {
            case .failure:
                //print(error)
                completionHandler(false)
            case .success:
                //print (value)
                completionHandler(true)
                }
        }
    

    用法

    login(username: "username", password: "password", completionHandler: { result in
    print("Your result is \(result)")
    })
    

    您必须使用完成处理程序,因为此代码以异步方式工作。简而言之,您“对代码收费”以便稍后执行。完成工作时会触发完成。您可以将此类代码恢复为通常的方式,但您必须使用互斥锁并注意线程阻塞操作。

    【讨论】:

      【解决方案3】:

      您需要使用完成处理程序:

      class func login(username: String, password: String, completion: (Bool) -> Void) {
          let url = "http://127.0.0.1:3000/login/" + username + "/" + password
          Alamofire.request(url).responseJSON { response in
              switch response.result {
              case .failure:
                  completion(false)
                  // print(error)
              case .success:
                  // print(value)
                  completion(true)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-18
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        相关资源
        最近更新 更多