簡體   English   中英

字典詞典字典詞典語法理解

[英]Dictionary of Dictionaries of Dictionaries of Dictionaries syntax understanding

我需要將建築物的門映射到一個單一的地圖中,此后,我需要使用此數據填充三個選取器。

每個門都包含以下數據:建築物,級別,范圍,門號和其他相關性較低的信息。 因此,我創建了以下地圖:

public var doorsMap: [String : [String : [String : [String: Door]]]] = [:]

並有一張我需要用來填充此地圖的門的列表,問題是我無法理解執行此任務的正確語法,我嘗試過:

doorsMap[door.building]?[door.level]?[door.range]?[door.number] = door

但這不會創建內部字典集。 當我嘗試做的時候:

doorsMap[door.building]![door.level]![door.range]![door.number] = door

顯然,我得到了:

致命錯誤:展開一個可選值時意外發現nil

因為我嘗試拆零值。

那么,迅速從門列​​表中填充此地圖的正確語法是什么?

單個分配不會創建多個中間目錄。 您需要明確地做到這一點。

您可以使用如下形式:

func add(door: Door) {
    var building = self.doorsMap[door.building] ?? [String : [String:[String: Door]]]()
    var level = building[door.level] ?? [String : [String: Door]]()
    var range = level[door.range] ?? [String:Door]
    range[door.number] = door
    level[door.range] = range
    building[door.level] = level
    self.doorsMap[door.building] = building
}

就個人而言,我會尋找一個更好的數據結構,也許使用一個結構來保存doorsMap 該結構可以具有處理門的插入和取回的功能。

也許是這樣的:

struct Door {
    let building: String
    let level: String
    let range: String
    let number: String
}

struct DoorMap {
    private var buildingsSet = Set<String>()
    private var levelsSet = Set<String>()
    private var rangesSet = Set<String>()
    private var numberSet = Set<String>()
    private var doorsArray = [Door]()

    var buildings: [String] {
        get {
            return Array(buildingsSet).sorted()
        }
    }

    var levels: [String] {
        get {
            return Array(levelsSet).sorted()
        }
    }

    var ranges: [String] {
        get {
            return Array(rangesSet).sorted()
        }
    }

    var numbers: [String] {
        get {
            return Array(numberSet).sorted()
        }
    }

    var doors: [Door] {
        get {
            return doorsArray
        }
    }

    mutating func add(door: Door) {
        buildingsSet.insert(door.building)
        levelsSet.insert(door.level)
        rangesSet.insert(door.range)
        numberSet.insert(door.number)
        doorsArray.append(door)
    }

    func doorsMatching(building: String? = nil, level: String? = nil, range: String? = nil, number: String? = nil) -> [Door]{

        let matches = doorsArray.filter { (potentialDoor) -> Bool in
            var included = true
            if let b = building {
                if potentialDoor.building != b {
                    included = false
                }
            }

            if let l = level {
                if potentialDoor.level != l {
                    included = false
                }
            }

            if let r = range {
                if potentialDoor.range != r {
                    included = false
                }
            }

            if let n = number {
                if potentialDoor.number != n {
                    included = false
                }
            }

            return included
        }

        return matches

    }
}

var map = DoorMap()

let d1 = Door(building: "b1", level: "1", range: "r1", number: "1")
let d2 = Door(building: "b1", level: "2", range: "r1", number: "2")
let d3 = Door(building: "b2", level: "2", range: "r1", number: "2")
map.add(door: d1)
map.add(door: d2)
map.add(door: d3)

let b1Doors = map.doorsMatching(building:"b1")
let level2Doors = map.doorsMatching(level:"2")
let allBuildings = map.buildings()

現在,也許您具有有關建築物和樓層等的更多信息,因此它們也可以是結構而不只是字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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