当前位置: 首页 > 面试题库 >

快速关闭未设置变量

闾丘冠玉
2023-03-14
问题内容

我试图设置一个变量,该变量位于该闭包内部的闭包外部,但最终不会被设置。然而,我设置变量的值
正在打印到控制台。同样,在设置返回变量并自行打印之后,将正确的值打印到控制台。当我返回变量时就会出现问题。其值与初始化时的值相同。这是一些伪代码:

let str: String = {
    var ret: String = "default value"

    functionWithClosure(with: (some_name) in {
        if let name = some_name {
            ret = name
            print(name) // prints successfully
            print(ret_name) // also prints successfully
        }
    })

    return ret // returns "default value"
}()

这是不起作用的实际代码:

let name: String = {
    var ret_name = "default value"

    if let uid = FIRAuth.auth()?.currentUser?.uid {
        FIRDatabase.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String: AnyObject] {
                if let name = dictionary["name"] as? String {
                    ret_name = name
                    print(ret_name)
                }
            }
        })
    }

    return ret_name
}()

问题答案:

.observeSingleEvent正在异步工作。

您可以执行以下操作:

func getRetname(completion: @escaping(_ retName: String) -> Void) {
    if let uid = FIRAuth.auth()?.currentUser?.uid {
        FIRDatabase.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            if let name = dictionary["name"] as? String {
                ret_name = name
                print(ret_name)
                completion(ret_name)
            }
        }
    })
}

然后,您可以在任何需要的地方使用它:

getRetname(completion: { ret_name in 
    // ret_name - your data
})

希望能帮助到你



 类似资料:
  • 问题内容: 我正在对服务器进行API调用。我正在利用Alamofire来解决这个问题。我正在尝试创建一个使用Alamofire的GET函数返回基于自定义类的对象的函数,该类包含此GET函数提供的各种输出。 我不清楚执行此操作的方式。 这是我的自定义类,其中包含有关响应的详细信息: 在另一个类中,我具有以下功能: 这将返回,因为在执行之前对服务器的调用未完成。我知道我应该能够使用闭包来做到这一点,但

  • 在时间视图中,从显示屏上方向下滑动,可下拉快速设置菜单。向左或向右滑动进行浏览,轻触可选择免打扰功能或飞行模式: 闹钟 : 设置闹铃重复:关闭、一次、周一至周五或每天。如果您选择一次、周一至周五或每天,同时也要设置闹钟的时间。 设置闹铃后,时间视图中将显示时钟图标。 免打扰:轻触免打扰图标可启用它,再次轻触将关闭图标。当启用免打扰时,您不会收到任何通知或来电提醒。背光灯激活手势也会被禁用。 飞行模

  • 在时间视图中,从显示屏上方向下滑动,可下拉快速设置菜单。 向左或向右滑动进行浏览,轻触可选择一个功能。 轻触 可定制您想在快速设置菜单中看到的功能。从闹铃、倒计时器、请勿打扰和飞行模式中进行选择。 闹铃:设置闹铃重复:关闭、一次、周一至周五或者 每天。如果您选择一次、周一至周五或每天,同时也要设置闹钟的时间。 启用闹铃后,时间视图中将显示时钟图标。 倒计时器:选择设置计时器,然后设置倒计时时间并按

  •  对于经常需要填写的报表,我们可以以按钮的方式显示在工具栏上,这样我们只要点击这些按钮就可以快速进入填表状态。 如下图所示 点击 E立方管理平台  选项… ,出现如下界面: 在需要快捷方式的报表前面打上勾(如果要取消已有的快捷方式,取消打勾即可),点击“确定”关闭窗体,然后退出并重新登录(必须重新登录才会生效)。如果是第一次设置快捷方式,重新登录后会出现一个悬浮工作栏,如下图所示: 你可以把它拖

  • 问题内容: 如何从字符串返回预定义时区中的NSDate 上面的代码返回时间为 问题答案: 如何在预定义的时区中返回NSDate? 你不能 的实例不包含有关时区或日历的任何信息。它只是简单地确定了通用时间的一点。 您可以在任何日历中解释该对象。Swift的字符串插值(示例代码的最后一行)使用的是使用UTC(即输出中的“ +0000”)的。 如果要将的值作为当前用户日历中的字符串,则必须为此显式设置日

  • 问题内容: 一个可以被转换为使用,但有在新的没有这样的方法(与夫特1.2引入)。仍然可以通过将Swift Set转换为NSSet并使用该方法来完成,但这并不是最佳选择。 问题答案: 您可以简单地使用给定Swift的所有元素创建一个数组 之所以有效,是因为符合协议,并且可以使用序列进行初始化。例: