web-dev-qa-db-fra.com

Comment ajouter un tableau dans un autre tableau dans Swift?

J'ai une réponse JSON dont je dois analyser la réponse. J'écris les éléments simples dans un tableau appelé courseDataArray en utilisant un for loop. Après cela, je veux écrire ce tableau nouvellement créé dans un autre tableau appelé combinedCourseArray dans le but de le transmettre à un UITableView. Créer le premier tableau semble bien fonctionner.

Mais comment puis-je créer un autre tableau combinedCourseArray qui contient tous les tableaux de type courseDataArray?

for (index, element) in result.enumerate() {

            // get one entry from the result array
            if let courseEntry = result[index] as? [String:AnyObject]{

                //work with the content of the array
                let courseName = courseEntry["name"]
                let courseType = courseEntry["course_type"]
                let courseDate = courseEntry["cor_date"]
                let courseId = courseEntry["cor_id"]
                let duration = courseEntry["duration"]
                let schoolId = courseEntry["sco_id"]
                let status = courseEntry["status"]


                let courseDataArray = ["courseName" : courseName, "courseType": courseType, "courseDate": courseDate, "courseId": courseId, "duration": duration, "schoolId":schoolId, "status":status]

                print(courseDataArray)

                var combinedCourseArray: [String: AnyObject] = [:]
                combinedCourseArray[0] = courseDataArray //does not work -- error: cannot subscript a value of type...

               // self.shareData.courseStore.append(scooter)

            }
4
Stefan Badertscher

Vous devez déplacer la déclaration CombinedCourseArray en dehors du tableau. Ce devrait être var combinedCourseArray: [[String: AnyObject]] = [[:]] puisqu'il s'agit d'un tableau et non d'un dictionnaire.

Et tu devrais faire

combinedCourseArray.append(courseDataArray)

au lieu de

combinedCourseArray[0] = courseDataArray
5
WMios
var FirstArray = [String]()
var SecondArray = [String:AnyObject]()

FirstArray.append(contentsOf: SecondArray.value(forKey: "key") as! [String])
5
Shakeel Ahmed

Commencez par déclarer ce tableau combinedCourseArray à l'extérieur de cette boucle

var combinedCourseArray: [[String: AnyObject]] = [[String: AnyObject]]()
for (index, element) in result.enumerate() {

        // get one entry from the result array
        if let courseEntry = result[index] as? [String:AnyObject]{

            //work with the content of the array
            let courseName = courseEntry["name"]
            let courseType = courseEntry["course_type"]
            let courseDate = courseEntry["cor_date"]
            let courseId = courseEntry["cor_id"]
            let duration = courseEntry["duration"]
            let schoolId = courseEntry["sco_id"]
            let status = courseEntry["status"]


            let courseDataArray = ["courseName" : courseName, "courseType": courseType, "courseDate": courseDate, "courseId": courseId, "duration": duration, "schoolId":schoolId, "status":status]

            print(courseDataArray)


            combinedCourseArray.append(courseDataArray) //does not work -- error: cannot subscript a value of type...

           // self.shareData.courseStore.append(scooter)

        }
 }
3
Nirav D

Utilisez simplement flatMap sur le tableau extérieur pour traduire un tableau en un autre, en supprimant éventuellement certains éléments:

let courseDataArray : [[String:AnyObject?]] = result.flatMap {
    guard let courseEntry = $0 as? [String:AnyObject] else {
        return nil
    }

    return [
        "courseName" : courseEntry["name"],
        "courseType": courseEntry["course_type"],
        "courseDate": courseEntry["cor_date"],
        "courseId": courseEntry["cor_id"],
        "duration": courseEntry["duration"],
        "schoolId": courseEntry["sco_id"],
        "status": courseEntry["status"]
    ]
}

Bien sûr, la protection n'est pas vraiment nécessaire car le type d'entrée est probablement déjà [[String:AnyObject]] et comme vous ne pouvez plus avoir d'échec interne, vous pouvez simplement utiliser map au lieu de flatMap

1
David Berry