在swift中增加字典中的所有键和值

时间:2015-02-04 02:03:51

标签: swift

我希望将此词典中的每个键和值增加0.5

var times = [0800.0:0855.0,0900.0:0939.0,0942.0:1021.0,1023.0:1054.0,1057.0:1136.0]

2 个答案:

答案 0 :(得分:2)

我建议你下次再制定一个更详细的问题。

你做了什么?你在哪里被困?

一个好的起点是this guide

话虽如此,并询问我认为是你的问题:

这种天真的方式是迭代值和键,递增值/键,然后删除前一个键:

for (k, v) in times {
    times[k + 0.5] = v + 0.5
    times[k] = nil
}

这种方法的问题在于,如果字典中任何一点都存在k + 0.5,那么该值将被覆盖。

选项B

var newTimes = [Double: Double]()
for (k, v) in times {
    newTimes[k + 0.5] = v + 0.5
}
times = newTimes

答案 1 :(得分:0)

如果我理解您的请求比您提出的更好,那么您使用的是错误的数据结构。您有一个范围的时间列表,而不是与其他时间值相关联的时间值。

所以,我的建议是,首先,您使用[Double: Double]代替[ClosedInterval<Double>]。定义它也很酷,例如let times = [0800.0 ... 0855.0, 0900.0 ... 0939.0]

然后,从那里,你可以很容易地做你所要求的: let shiftedTimes = times.map { ($0.start + 0.5) ... ($0.end + 0.5) }

n.b。:这里的事情是,始终找到最适合数据的数据结构最适合不是我认识的那个,而是更好地代表它的那个

修改

通过改进解决方案,我说首选类型为[ClosedInterval<NSTimeInterval>],您可以定义这样的运算符:

func +<T: IntegerArithmeticType>(lhs: ClosedInterval<T>, rhs: T) -> ClosedInterval<T> {
    return (lhs.start + rhs) ... (lhs.end + rhs)
}
func +<S: Strideable, T where S.Stride == T>(lhs: ClosedInterval<S>, rhs: T) -> ClosedInterval<S> {
    return (lhs.start + rhs) ... (lhs.end + rhs)
}

然后整个操作变为let shiftedTimes = times.map { $0 + 0.5 }:)