RDowns
RDowns

Reputation: 659

Why can I not access the second level of this array in Swift?

I have the following array which is passed from an API call from a PHP Script:

["playerForm": {
1 =     (
            {
        date = "2017-01-31";
        name = Dicky;
        result = L;
        "results_id" = 42;
    },

            {
        date = "2016-12-24";
        name = Dicky;
        result = W;
        "results_id" = 19;
    }
);
2 =     (
            {
        date = "2017-01-25";
        name = G;
        result = W;
        "results_id" = 38;
    },
            {
        date = "2017-01-25";
        name = G;
        result = D;
        "results_id" = 40;
    },    
            {
        date = "2017-01-21";
        name = G;
        result = L;
        "results_id" = 34;
    }
);
3 =     (
            {
        date = "2017-01-31";
        name = Sultan;
        result = W;
        "results_id" = 42;
    },

            {
        date = "2017-01-15";
        name = Sultan;
        result = L;
        "results_id" = 30;
    }
);
}]

However I cannot seem to access the 1,2,3 parts of it...

 let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
                    print (json!)

                    if let dict = json?["playerForm"] as? [String:AnyObject] {
                        print ("step 1")
                        if let arr = dict["1"] as? [[String:String]] {


                            print ("step 2")

                            self.leagueForm = arr.flatMap { Form($0) }
                            print (self.leagueForm)
                            print (self.leagueForm.count)

                            for i in 0..<self.leagueForm.count {
                                let form = self.leagueForm[i]
                                print (form.player_results!)
                                self.formGuide.append(form.player_results!)

                            }

                            print ("now")
                            print (self.formGuide)
                            self.resultsDisplay.results = self.formGuide
                            self.resultsDisplay.results = self.resultsDisplay.results.reversed()
                            self.resultsDisplay.displayResults()

                        }

                    }

With this code above it only gets as far as Step 1.

What am I doing wrong?

UPDATED WITH PROGRSS*

  let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
                    print (json!)

                    if let dict = json?["playerForm"] as? [String:AnyObject] {
                        print ("step 1")

                        for (_ , value) in dict {
                            if let arr = value as? [[String:Any]] {
                                print(arr)
                                //your code
                            }
                        }


                    }

Custom Struct to define array:

struct Form {
    var player_result: String?
    var player_name: String?
    var result_date: String?
    var result_id: String?

    init(_ dictionary: [String : Any]) {
        self.player_result = dictionary["result"] as? String ?? ""
        self.player_name = dictionary["name"]  as? String ?? ""
        result_date = dictionary["date"]  as? String ?? ""
        result_id = String(dictionary["results_id"]  as? Int ?? 0)

    }
 }

Upvotes: 0

Views: 68

Answers (1)

Nirav D
Nirav D

Reputation: 72410

Change your array type [[String:String]] to [[String:Any]] because it contains both String and Number as value.

if let arr = dict["1"] as? [[String:Any]] {
    print(arr)
    //your code
}

Note: You need to loop through the dict Dictionary because its each key having array.

for (_ , value) in dict {
    if let arr = value as? [[String:Any]] {
         print(arr)
         //your code
    }
}

Upvotes: 1

Related Questions