如何将闭包函数的返回值设置为变量?

时间:2018-08-31 13:41:07

标签: ios swift closures

我有一个关闭功能,可以从Web服务器上载和返回数据。以下代码将打印我想要的值。

  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)
}

它正在打印“ []”。

3 个答案:

答案 0 :(得分:2)

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

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

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

直到执行闭包,变量x的默认值为var x = [[String: String]]() 或者如果您未提供默认值和声明,则保持未解决状态。

答案 1 :(得分:1)

    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.
    }

答案 2 :(得分:0)

您似乎要使用的闭包正在异步函数中运行(您可以通过参数名称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
})