Swift 比嵌套字典更合适的解决方案?

Swift 比嵌套字典更合适的解决方案?,swift,dictionary,Swift,Dictionary,我正在努力使用我的应用程序,它处理公交线路。在每一个公交车站,我都能看到未来从那里出发的公交车的每一次发车,发车包括发车方向和时间。我希望能够得到公共汽车在给定方向离开的所有时间,到目前为止,我已经通过创建嵌套字典做到了这一点,但是,我想知道您是否可以更智能地做到这一点?这就是我目前得到的 var dict = [String: [String : [String]]]() 所以它会是这样的: var dict = ["Busname": ["Direction" : ["time1", "t

我正在努力使用我的应用程序,它处理公交线路。在每一个公交车站,我都能看到未来从那里出发的公交车的每一次发车,发车包括发车方向和时间。我希望能够得到公共汽车在给定方向离开的所有时间,到目前为止,我已经通过创建嵌套字典做到了这一点,但是,我想知道您是否可以更智能地做到这一点?这就是我目前得到的

var dict = [String: [String : [String]]]()
所以它会是这样的:

var dict = ["Busname": ["Direction" : ["time1", "time2", "time3"]]]()
let times = todayBusses.filter { $0.name == "theBusName" }.map { $0.times }

有更聪明的方法吗?还是这条路要走?我想得到给定方向的给定公交车的发车时间列表。

您可以使用结构而不是字典

快速示例,让我们创建一个总线对象:

struct Bus {
    var name: String
    var direction: String
    var times: [NSDate]
}
它保存每个总线的值:总线的名称、方向和总线时间的日期数组

当然,这只是一个例子,您必须适应您的用例

您可以创建总线:

let bus1 = Bus(name: "Busey MacBusface", direction: "Somewhere", times:  [...some dates...])
let bus2 = Bus(name: "Gary Bussey", direction: "Nowhere", times:  [...some dates...])
您可以将它们放在集合中:

let todayBusses = [bus1, bus2]
易于过滤:

let allDirections = todayBusses.map { $0.direction }
let allTimes = todayBusses.map { $0.times }
let someBusses = todayBusses.filter { $0.times.contains({ (date) in
    // compare 'date' with other date(s)
}) }
let notNowhere = todayBusses.filter { $0.direction != "Nowhere" }
等等

同样,这只是一个简单的例子,但我认为它可以给你一些想法

“公共汽车特定名称的时间”类似于:

var dict = ["Busname": ["Direction" : ["time1", "time2", "time3"]]]()
let times = todayBusses.filter { $0.name == "theBusName" }.map { $0.times }

你如何知道一辆公共汽车的具体名称的时间?我需要搜索总线,然后打印出数组中的项目?我已经用一个例子更新了我的答案。请注意,我在示例中使用的是map和filter,但如果您不熟悉这一点,当然也可以像往常一样使用循环。目前,我有一个包含stops的类和一个包含derparture的类,它包含在数组中的stop类中。因此,您只需创建另一个类/结构并循环所有偏离,以确保它们被添加到正确的总线对象?问题是,同一辆公交车在JSON中会重复很多次,因为它每天有几趟发车。因此,我想我必须在总线列表中循环,检查我所在的总线是否已经在其中,如果没有,我将创建一个对象并添加它,否则我将只将时间添加到当前对象的列表中?由您决定如何构造类(或结构),但我强烈建议不要使用嵌套字典。它非常麻烦,而且类型也不安全——另一方面,结构良好的对象和它们周围方便的包装器(例如,总线管理器可以有一系列总线对象和方法来对它们进行排序)在使用和过滤集合时是救命稻草。当然,在我看来,还有其他的模式,但这是一个相当常见的模式。我明白了。还有一个问题,当我浏览列表检查元素是否已经存在时,我使用
list.contains(item)
但是,当元素被包含时,我想将item time添加到当前items数组中,这怎么可能呢?