Как добавить новый массив в многомерный массив? [Swift] - PullRequest
1 голос
/ 18 февраля 2020

Как добавить новый элемент в многомерный массив?

    struct Cat: Codable { var childrens: [Cat]? var name: String? var colour: String? } 

Это мой текущий массив

var currentShop = [
            [ 
                "children": [ 
                    [
                        "children": [], 
                        "name": "Tom", 
                        "colour": "Brown"
                    ], 
                    [ 
                        "children": [], 
                        "name": "Anggie", 
                        "colour": "White" 
                    ], 
                    [ 
                        "children": [
                            [ 
                                "children": [], 
                                "name": "Lily", 
                                "colour": "White" 
                            ]
                        ], 
                        "name": "Snowy", 
                        "colour": "White" 
                    ], 
                ], 
                "name": "Sandy", 
                "colour": "Brown" 
            ], 
            [ 
                "children": [], 
                "name": "Mike", 
                "colour": "Black"
            ], 
            [ 
                "children": [], 
                "name": "Tommy", 
                "colour": "White" 
            ], 
            "name": "Blackie",
            "colour": "Black"
        ]

Новый массив

var newChildren = [
            [
                "children": [], 
                "name": "Pus", 
                "colour": "White" 
            ],
            [
                "children": [], 
                "name": "Boots", 
                "colour": "White"
            ]
]

Добавление новых детей для Cat name под Snowy. Как я могу обновить кошек в массиве currentShop?
Мой текущий код для поиска родителя

func updateCatShop(parentName:String, Cats: [Cat], newCats:[Cat] ) -> [Cat] { 
    var catList = Cats for var cat in Cats { 
        if(cat.name == parentName) { 
            var updateCats = cat.childrens! + newCats cat.childrens = updateCats
        } else { 
            for (_, childCat) in cat.childrens!.enumerated(){
                updateCatShop(parentName: parentName, Cats: [childCat], newCats: newCats)
            } 
        } 
    }
    return catList
}

var currentShop = updateCatShop(parentName:"Snowy", Cats:currentShop, newCats: newChildren)

Каков наилучший способ обновления объекта с несколькими измерениями?

1 Ответ

1 голос
/ 18 февраля 2020

Это не полный ответ, а предложение направления к go, чтобы улучшить модель данных и упростить работу с ней.

В настоящее время вы используете рекурсивные структуры, и это делает с ним трудно работать. Но ... вам все равно нужно поддерживать отношения между родителями и детьми.

Я также предполагаю, что ваши Shop будут отслеживать только кошек (и родителей и детей), которые есть в наличии в магазине .

Первоначальное улучшение вашей модели данных может выглядеть примерно так ...

struct Cat {
    let id: String
    let name: String
    let colour: String
    var children: [String] // this is now an array of IDs
}

Теперь вы можете поддерживать одномерный массив Cats ... или ... еще лучше ... a Shop.

struct Shop {
    var cats: [String: Cat]

    func add(cat: Cat, parentID: String?) {
        cats[cat.id] = cat

        if let parentID = parentID,
           let parentCat = cats[parentID] {
            parentCat.children.append(cat.id)
        }
    }
}

Или что-то в этом роде. Это потребует настройки, так как может не обновлять массив потомков должным образом.

Вы также должны убедиться, что идентификаторы кошек уникальны.

Следующая итерация этого будет хранить ваши данные либо в CoreData, либо в каком-либо другом хранилище, например Firestore et c ... Там, где вы можете гораздо легче хранить множество кошек во многих магазинах, и наличие хорошей модели данных становится более важным.

...