我正在从Firebase数据库读取数据并将其存储在消息对象中,然后如何访问该数组中的每个元素?即我如何使用城市字符串,因为我希望将其分配给标签。数组中的其他元素相同。
firebaseDB.collection("user").document(key).collection("address").getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
}
else {
self.dataArr.removeAll()
for document in querySnapshot!.documents {
//print("\(document.documentID) => \(document.data())")
let msgdata = document.data() as! [String:Any]
var msgObj = Details()
if let city = msgdata["city"] as? String {
msgObj.city = city
}
if let country = msgdata["country"] as? String {
msgObj.country = country
}
if let county = msgdata["county"] as? String {
msgObj.county = county
}
if let lineOne = msgdata["lineOne"] as? String {
msgObj.lineOne = lineOne
}
if let lineTwo = msgdata["lineTwo"] as? String {
msgObj.lineTwo = lineTwo
}
if let postCode = msgdata["postCode"] as? String {
msgObj.postCode = postCode
}
self.dataArr.append(msgObj)
}
}
}
我将需要访问每个元素,因为我还有另一个函数,该函数将把每个元素放置在ViewController的标签上
我希望拥有这样的东西
func DisplayAddress(){
city.text = city
postCode.text = postCode
}
答案 0 :(得分:0)
我可能完全错读了这个问题,但是在尝试将读入时,我认为可能需要对术语进行澄清;对象与数组
对象具有属性-让我们检查Details()对象
var msgObj = Details()
其中包含一个用户的地址信息。所以从概念上讲,这就是它在FireStore中的表示方式
users
this_user
address
city: "some city"
country: "some country"
county: "some county"
line1: "line one"
“文档”是地址集中存储的项目
city: "some city"
country: "some country"
county: "some county"
line1: "line one"
,并且Details()对象具有与那些文档相对应的属性,并将它们存储为对象内的属性;城市,县等
msgObj.city = city
msgObj.country = country
另一方面,数组包含一系列的对象,而不是属性。例如数组通常不包含城市,国家等,但是它将包含一系列的Details()对象,并且每个Detail()对象都具有城市,国家等的属性。例如,假设您想使用几个不同用户的地址-您将为每个用户创建一个Details()对象,其中包含他们的地址信息,并将每个用户追加到一个数组中。
self.dataArry[0] = the Details() objects of one user
self.dataArry[1] = the Details() object of another user
self.dataArry[2] = the Details() object of a third user
然后,您可以例如在该用户的一定半径内显示用户,或向他们发送所有电子邮件等。
要回答您的问题,如果您使用的是单个用户的地址信息,则不需要数组,您可以将其存储为类中的单个Details()对象变量。
class ViewController: UIViewController {
var myUserAddress = Details()
func to get this users address documents from FireStore {
if let city = msgdata["city"] as? String {
self.myUserAddress.city = city
}
if let country = msgdata["country"] as? String {
self.myUserAddress.country = country
}
//remember that the properties are only valid from here on
//as FireStore is asychronous
self.DisplayCity()
self.DisplayLocation()
}
//and then later on when you want to display those properties
func DisplayCity() {
let city = self.myUserAddress.city
print(city)
}
func DisplayLocation() {
let lon = self.myUserAddress.logitude
let lat = self.myUserAddress.latitude
//show the location on a map via lon & lat
}