【问题标题】:Access data outside of Closure // iOS Swift在闭包之外访问数据 // iOS Swift
【发布时间】:2016-12-02 02:39:15
【问题描述】:

如何在闭包之外访问“用户”?

    let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!)
        currentUser.observeSingleEvent(of: FIRDataEventType.value, with: { snapshot in
        let value = snapshot.value as? NSDictionary
        let name = value?["name"] as? String
        let age = value?["age"] as? String
        let user = UserStruct.init(name: name, age: age)
    })

Firebase 中的一切都是正确的,并且数据存在且不为零。但我需要像这样在闭包之外引用“用户”:

print(user.name)
print(user.age)

【问题讨论】:

  • 您需要在闭包范围之外定义用户,并将其填充到闭包中,然后在使用用户之前等待闭包完成,或者您可以使用完成处理程序
  • 什么声明用户在范围之外,因为它正在接受一个结构?一本字典?我尝试使用完成处理程序,但我不应该放置它。
  • 好吧UserUserStruct,所以就这样声明吧。
  • 好吧,我试了一下,var user = [UserStruct](),然后改成这个,self.user = [UserStruct.init(name: name, age: age)],然后参考就像这样,打印(用户[0].name)。但我的致命错误索引超出范围
  • 来自我的第一条评论:“然后等待关闭完成后再使用用户”

标签: ios swift


【解决方案1】:

在闭包之外声明user 变量,然后使用self 修饰符访问它。

    var user: UserStruct
    let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!)
        currentUser.observeSingleEvent(of: FIRDataEventType.value, with: { snapshot in
        let value = snapshot.value as? NSDictionary
        let name = value?["name"] as? String
        let age = value?["age"] as? String
        self.user = UserStruct.init(name: name, age: age)
    })

【讨论】:

  • 我收到此错误,“ViewController”类没有初始化程序
  • 它通过这样做运行,var user: UserStruct!,但我在 viewDidLoad 中仍然得到一个可选值
  • 请贴出您所指的代码以及发生错误的行。
  • 如果你得到 Class 'ViewController' has no initializers 错误,你可能将你的变量声明为非可选的并且没有在 init 方法中赋值,然后 swift 抱怨你有一个变量它应该有一个值,但没有一个。在这种情况下,将您的变量声明为可选,然后使用可选绑定访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2017-10-05
相关资源
最近更新 更多