每次我运行这行代码时它都不起作用,任何人都可以帮助我改变它吗?谢谢你的帮助。 :)
以下是我不断收到的错误
输入任意?没有下标成员
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 使变量处于两种状态之一的方法,即有值或有值nil
。变量只能处于这些状态之一。通过在变量前面添加问号,可以使变量成为可选变量。
2. Any
通过将变量声明为类型Any
,这意味着您在声明期间没有明确声明其类型。 Firebase 使其所有返回都为类型Any
为了让我们开发人员可以按照我们的意愿修改数据,从而减少我们方面的限制。
snapshot.value
属于类型Any
但 Firebase 总是返回一个 JSON 树,并且 JSON 树可以表示为词典 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html。那么我们应该做什么呢?
- Since
snapshot.value
是一个可选的,我们应该首先检查它是否nil
.
- If not
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 i.e from AnyObject to say String or Int etc
let userName = firebaseResponse["Username"] as! String
self.usernameField.text = username
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)