簡體   English   中英

如何從IOS Swift'Any'類型訪問和獲取嵌套值?

[英]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))
}

在此上下文中, elementAny對象,因此您無法訪問任何基礎屬性。 為此,您有兩個選擇:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM