我希望将此词典中的每个键和值增加0.5
var times = [0800.0:0855.0,0900.0:0939.0,0942.0:1021.0,1023.0:1054.0,1057.0:1136.0]
答案 0 :(得分:2)
我建议你下次再制定一个更详细的问题。
你做了什么?你在哪里被困?
一个好的起点是this guide。
话虽如此,并询问我认为是你的问题:
这种天真的方式是迭代值和键,递增值/键,然后删除前一个键:
for (k, v) in times {
times[k + 0.5] = v + 0.5
times[k] = nil
}
这种方法的问题在于,如果字典中任何一点都存在k + 0.5,那么该值将被覆盖。
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 }
:)