我正在使用Array
和一个看起来像的自定义类在Swift中建模时间序列日志:
class StatusEvent {
var status:ValveStatus // this is just an enum
var begin:NSDate
}
当我获取日志的更新时,我维护不变量的不变量(通过匹配时间推断),并且它们按begin
属性按顺序排序。我对这些数据的三个用途是:
我可以做一些快速检查,例如“这是一个添加过去的结尾还是前面的”,它会照顾很多,但是当我发现我必须插入中间位置的情况时,我来了以下内容:
var begin = oldestLogEvent.begin
for index in 1..<self.statusLog.count {
let event = self.statusLog[index]
let end = event.begin
if newEvent.begin == end {
return false;
}
if begin < newEvent.begin && newEvent.begin < end {
self.statusLog.insert(newEvent, atIndex: index)
return true;
}
begin = end;
}
我返回一个Bool
,表示是否发生了插入。
从Objective-C移植了这个,我很好奇Swift是否给了我一些可以解决这个“搜索插入点和条件插入”算法的工具/习语?
我愿意使用除Array和简单事件类之外的其他类;我查看了使用树,但虽然这使得插入可能更快,但我认为它会花费更多的内存以及枚举和最后一个元素访问(我的主要用例)更慢。
答案 0 :(得分:1)
首先,在Swift中,如果你没有充分的理由让它成为一个类,那就把它变成一个结构。
其次,在回答你的实际问题时,我所做的远不如你想象的那么简单:我只会让StatusEvent成为可比较的(即它知道一个StatusEvent比另一个更大,如果它{ {1}}更大)然后只需添加一个新的状态事件并在begin
上对数组进行排序。
这可能有第二个好处;你必须使StatusEvent成为Equatable,如果你的<
相同,你决定两个StatusEvent是相同的,你可以使用begin
来确定一个StatusEvent是否具有相同的{{1} }已存在于数组中。
这是一个简化的例子(我使用的是Int而不是Date):
find