input'Any?' 没有下标成员(使用Firebase)

每次我运行这行代码都行不通,任何能帮助我的人都可以改变它呢? 谢谢你的帮助。 🙂

以下是我不断收到的错误

inputAny? 没有下标成员

var ref:FIRDatabaseReference? var refHandle: UInt! var postData = [String]() override func viewDidLoad() { super.viewDidLoad() ref = FIRDatabase.database().reference() refHandle = ref?.observe(FIRDataEventType.value, with: { (snapshot) in let dataDict = snapshot.value as! [String: AnyObject] print(dataDict) }) let username: String = (FIRAuth.auth()?.currentUser?.uid)! ref?.child("Users").child(username).observeSingleEvent(of: .value, with: { (snapshot) in let username = snapshot.value!["Username"] as! String self.usernameField.text = username }) } 

两个问题。

1.可选项

这就是Swift使variables处于两种状态之一的方式,即有值或nil 。 variables只能处于这些状态之一。 您可以通过在其前面添加一个问号来使variables成为可选项。

2.任何

通过声明一个variables为Anytypes,这意味着你在声明中没有明确地声明它的types。 Firebase使其所有的回报都是Anytypes的,以便让我们的开发人员可以select摆弄数据,所以请尽量减less我们的限制。

snapshot.value的types为Any但是Firebase总是返回一个JSON树,JSON树可以表示为字典 。 那我们该怎么办?

  1. 由于snapshot.value是可选的,我们应该首先检查是否nil
  2. 如果不是nil ,则将其转换为字典,然后开始访问其中的相应元素。

下面的代码为你做了这个工作,我已经添加了评论来解释发生了什么。

 ref?.child("Users").child(username).observeSingleEvent(of: .value, with: { (snapshot) in // This does two things. // It first checks to see if snapshot.value is nil. If it is nil, then it goes inside the else statement then prints out the statement and stops execution. // If it isn't nil though, it converts it into a dictionary that maps a String as its key and the value of type AnyObject then stores this dictionary into the variable firebaseResponse. // I used [String:Any] because this will handle all types of data types. So your data can be Int, String, Double and even Arrays. guard let firebaseResponse = snapshot.value as? [String:Any] else { print("Snapshot is nil hence no data returned") return } // At this point we just convert the respective element back to its proper data type ie from AnyObject to say String or Int etc let userName = firebaseResponse["Username"] as! String self.usernameField.text = username })