【问题标题】:How do I set the return value of a closure function to a variable?如何将闭包函数的返回值设置为变量?
【发布时间】:2023-04-09 02:16:02
【问题描述】:

我有一个从网络服务器上传和返回数据的闭包函数。以下代码将打印我想要的值。

  loadData1(onCompletion: { (json) in
     print(json)
  })

我的问题是我需要将打印值设置为等于要在函数外部使用的变量。我试过这个:

  let x = loadData1(onCompletion: { (json) in
     return json
  })

但我收到警告“推断常量 'x' 具有类型 '()',这可能是意外的”并且 x 的值等于“()”。作为参考,json的类型是[[String:String]]。

编辑: 目前有这个

var x = [[String: String]]()
override func viewDidLoad() {
    super.viewDidLoad()
    loadData1(onCompletion: { (json) in
        self.x = json
    })
    print(x)
}

它正在打印“[]”。

【问题讨论】:

  • print(x) 在闭包内,在 self.x = json 之后
  • 你需要学习异步处理。
  • @AnastasiaKovaleva 如何在代码的不同部分访问 x?我需要在集合视图单元格中使用它。
  • 那么你最好在加载 json 时显示任何占位符数据,并在回调闭包内初始化 x 后用检索到的数据重新加载集合视图单元格。
  • @AnastasiaKovaleva 我仍然不确定如何在闭包之外访问 json 数据?如果我将 x 放在 ui 集合单元格中,它是一个未解析的标识符。

标签: ios swift closures


【解决方案1】:

尝试在闭包内设置 x 变量的值:

loadData1(onCompletion: { (json) in
     x = json
})

在您使用闭包初始化的方法变量 x 中,这就是您收到警告的原因。

直到闭包被执行,变量 x 具有默认值 var x = [[String: String]]() 或者如果您没有在声明中提供默认值,则仍然未解决。

【讨论】:

  • 当我这样做并尝试在闭包之外打印(x)时,我收到错误“使用未解析的标识符'x'”
  • @jh95 使用前需要声明并初始化变量,例如var x = [[String: String]]()
  • @jh95 没错,因为变量 x 在 API 调用返回一些数据之前不会初始化,即会调用闭包。由于您的闭包将被异步调用,因此变量 x 将仅在闭包主体执行后初始化。
  • 如果最初初始化变量 x,闭包外的 print(x) 将显示空的字典数组。
  • @AnastasiaKovaleva 查看编辑。我想你刚刚在最后的评论中解释了这一点。所有东西的正确位置是什么?
【解决方案2】:
    var x = [[String: String]]()

    func loadData1(onCompletion: @escaping ([[String: String]]) -> ())
    {
        //do your stuff here and assume you get your data
        let data = [["key": "str"]]
        //then call completion callback
        onCompletion(data)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        loadData1(onCompletion: { json in
            self.x = json
            print(self.x)
        })

        //if you print here can not make sure you finished loadData1() because it is a async call.
    }

【讨论】:

    【解决方案3】:

    看起来您尝试使用的闭包在异步函数中运行(您可以通过参数名称onCompletion 猜到)。这意味着 print(x) 在调用完成处理程序之前执行,因此尚未分配 json 的值。为了快速修复,您可以将 print(x) 移到里面。

    loadData1(onCompletion: { (json) in
        self.x = json
        print(self.x) // Now you guaranteed to have the value assigned to x before printing
    })
    

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2022-01-22
      • 2012-10-18
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多