[英]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.