swift - 为什么局部变量的值没有在 try block 中初始化?

标签 swift swift3

我有一个 Bool 类型的局部变量初始化为 FALSE。我试图根据特定条件在 try block 中设置 this 的值。条件为真,值变为真。当检查 block 内部和外部的值时,它们是不同的。内部为 true,外部为初始化值,即;错误。

func  Print() ->  Bool{
    print(userName)
    print(password)
    var statusValue:Bool = False
    let request: Request = Request()
    let body: NSMutableDictionary = NSMutableDictionary()
    do{
    try request.post(url: url, body: body, completionHandler: { data, response, error in
        if error != nil{
            print(error?.localizedDescription)
            return
        }
        let statuscode = response as? HTTPURLResponse
            print("error:",error)
            print("status code:",statuscode?.statusCode)
        if statuscode?.statusCode == 200 {
            print("Success")
            statusValue = True
        }
        else{
            print("Fail")
        }
    })
    }
    catch{
        print("Not me error")
    }
    print("Printing status value outside:",statusValue)
   return statusValue
}

“statusValue”的值打印不同。内部设置为 True,外部打印 False。

最佳答案

当您的代码是同步时,从函数返回值是有效的,但在您的情况下,您正在发出网络请求(异步调用),因此结果将可用在一些毫秒之后,返回值没有任何意义。

相反,您可以使用闭包“返回”结果,如下所示:

func Print( completion: @escaping (_ statusValue: Bool) -> Void ) ->  Void {

  var statusValue:Bool = False
  let request: Request = Request()
  let body: NSMutableDictionary = NSMutableDictionary()
  do{
    try request.post(url: url, body: body, completionHandler: { data, response, error in
      if error != nil{
        print(error?.localizedDescription)
        completion(false)
        return
      }

      let statuscode = response as? HTTPURLResponse

      if statuscode?.statusCode == 200 {
        print("Success")
        statusValue = True
        completion(statusValue)
      }
      else{
        completion(false)
      }
    })
  }
  catch{
    completion(false)
  }

}
<小时/>

当您调用该函数时:

Print(completion: { statusValue in
  print(statusValue)
})

关于swift - 为什么局部变量的值没有在 try block 中初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40020168/

相关文章:

ios - 如何将数据从观察到的类传递到另一个类?

ios - 如何在 Timer 对象中指定重复直到时间 - Swift 3

ios - 当有 2 个部分时,从 CoreData 填充部分中的行数

swift - 如何在 View Controller 之间传递时显示事件指示器

ios - 将信息从 TableView 传递到 View Controller 不是基于 indexPathForSelectedRow,而是基于所选单元格的标签文本?

swift - Xcode 7.3 升级到 8.3.1 后链接器错误

swift - Swift 中简单类的初始化程序出错

ios - swift - 使用 replaceRange() 来更改字符串中的特定事件

swift - 我是 swift 的绝对初学者。我不知道我的代码输出有什么问题,这是基于变异方法

ios - AVPlayer 早期停止了 Swift 3