[英]How to access & get nested values from IOS Swift 'Any' type?
我正在嘗試使用Struct從Firestore讀入Dictionary [Any]類型。 我可以使用Any類型將值加載到變量“數據”字典中。 但是,我無法通過它循環訪問普通的嵌套Dictionary變量。 我無法獲取鍵,無法打印值。
以下是我的代碼:
class PullQuestions {
//shared instance variable
**public var data = [Any]()**
private var qdb = Firestore.firestore()
public struct questionid
{
let qid : String
var questions : [basequestion]
var answers: [baseans]
}
public struct basequestion {
let category : String
let question : String
}
public struct baseans {
let answer : String
}
class var sharedManager: PullQuestions {
struct Static {
static let instance = PullQuestions()
}
return Static.instance
}
static func getData(completion: @escaping (_ result: [Any]) -> Void) {
let rootCollection = PullQuestions.sharedManager.qdb.collection("questions")
//var data = [Any]()
rootCollection.order(by: "upvote", descending: false).getDocuments(completion: {
(querySnapshot, error) in
if error != nil {
print("Error when getting data \(String(describing: error?.localizedDescription))")
} else {
guard let topSnapshot = querySnapshot?.documents else { return }
// var questiondoc = [basequestion]()
for questioncollection in topSnapshot {
rootCollection.document(questioncollection.documentID).collection("answers").getDocuments(completion: {
(snapshot, err) in
guard let snapshot = snapshot?.documents else { return }
var answers = [baseans]()
for document in snapshot { //There should be only one Document for each answer collection
//Read thru all fields
for i in 0..<document.data().count
{
let newAns = baseans(answer: answer)
print("Answer Docs=>", (answer))
answers.append(newAns)
}
}
let qid = questioncollection.documentID
let category = questioncollection.data()["category"] as! String
let question = questioncollection.data()["question"] as! String
let newQuestions = basequestion(category: category ,question: question)
let newQuestionDict = questionid(qid: qid, questions: [newQuestions], answers: answers)
PullQuestions.sharedManager.data.append(newQuestionDict)
//Return data on completion
completion(PullQuestions.sharedManager.data)
})
}
}
})
}
}
我可以這樣打印
print("Count =>", (PullQuestions.sharedManager.data.count))
// print(PullQuestions.sharedManager.data.first ?? "Nil")
print(PullQuestions.sharedManager.data[0])
for element in PullQuestions.sharedManager.data
{
print("Elements in data:=>", (element))
}
我只能訪問密鑰..我該如何獲取嵌套值?
首先,考慮使用Swift代碼約定(例如,您的結構以小寫字母命名,但您應該以大寫字母開頭),這將使您的代碼更具可讀性。
回到您的問題。 您使用數組而不是字典(這段代碼: public var data = [Any]()
)。 在這里,您嘗試打印值:
for element in PullQuestions.sharedManager.data
{
print("Elements in data:=>", (element))
}
在此上下文中, element
是Any
對象,因此您無法訪問任何基礎屬性。 為此,您有兩個選擇:
1.您應該在聲明中指定數組對象的類型,如下所示:
public var data = [questionid]()
或者您可以使用此:
public var data: [questionid] = []
這兩個是相等的,請使用您喜歡的一個。
2.如果出於某種原因不想在聲明中指定類型,則可以將其強制轉換為循環。 像這樣:
for element in PullQuestions.sharedManager.data
{
if let element = element as? quetionid {
print("Elements in data:=>", (element))
// you can also print element.qid, element.questions, element.answers
} else {
print("Element is not questionid")
}
}
您當然可以使用強制轉換:
let element = element as! questionid
並避免if let
語法(如果願意的話,也可以選擇guard let
),但是我不推薦這樣做,因為如果element為nil或任何其他類型,它(可能)可能會使您的應用程序崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.