在嵌套结构中查找结构

时间:2018-01-07 03:35:11

标签: swift struct filtering

我一直在尝试在嵌套结构列表中找到一个结构。任何人都可以帮我吗?

struct Places: PlacesProtocol {
    private(set) var id: String
    private(set) var name: String
    private(set) var childPlaces: [PlacesProtocol]?

    init(json: JSON) {
        self.name = json[“Name”]
        self.id = json[“Id”]
        self. childPlaces = json[“ChildPlaces”].arrayValue.map { Places(json: $0) }
    }

JSON:

{
    "Id": "1",
    "Name": "Place 1",
    "ChildPlaces": [{
        "Id": "12",
        "Name": "Place 2",
        "ChildPlaces": [{
            "Id": "123",
            "Name": "Place 3",
            "ChildPlaces": [{
                "Id": "1234",
                "Name": "Place 4",
                "ChildPlaces": null
            }]
        }, {
            "Id": "13",
            "Name": "Place 5",
            "ChildPlaces": null
        }]
    }]
}

我试过这个:

nestedStruct.filter { $0.id == "13" }

我能够将这个JSON解析为嵌套结构,并且我试图找到一个带有Id的结构。我尝试过滤器,但它只过滤嵌套结构的第一层。有没有办法可以构建递归过滤器来查找嵌套结构内部的结构。

1 个答案:

答案 0 :(得分:1)

您可以使用递归函数执行深度优先搜索。这是一个粗略的例子:

extension Place {

    depthFirstSearch(where closure: (Place) -> Bool) -> Place? {
        if closure(self) { return self }
        else {
            return self.chlidPlaces.first(where: { 
                $0.depthFirstSearch(where: closure)
            })
        }
    }
}


let placeID13 = mainPlace.depthFirstSearch(where: { $0.id == "13" })