useyourloaf.com/blog/swift-guide-to-map-filter-reduce /
我正在使用这个网站来了解swift地图如何工作以及查看来自各种框架的代码。 (通过这样做我学得更好)
现在,我正在研究Log
let durations = (0..<n).map { _ in duration { block() } }
----------------------------------------------------------
private func duration(_ block: () -> Void) -> Double {
let date = Date()
block()
return abs(date.timeIntervalSinceNow)
}
可以在https://github.com/delba/Log/blob/master/Source/Benchmarker.swift#L44找到该代码。
我的问题是,是否可以在不使用函数的情况下重写?
我在下面给出了一个错误 let durations2 = (0..<n).map ({
(block: (block) -> Void) -> Double in // the second block throws an error 'use of undeclared type block'
let date = Date()
block()
return abs(date.timeIntervalSinceNow)
})
答案 0 :(得分:0)
当你使用map
时,闭包的参数将是&#34; stuff&#34;的类型。您正在使用map
。 0..<n
是CountableRange<Int>
,包含0,1,...,n-1,因此参数的类型为Int
。您想要创建一个时间间隔数组。也许使用明确的类型,这将变得更加清晰:
let range: CountableRange<Int> = 0..<n
let durations2 = range.map { (Int) -> TimeInterval in
let date = Date()
// Code you want to measure.
return abs(date.timeIntervalSinceNow)
}
使用map
,您通常会获取元素列表,并通过对每个输入元素应用闭包来创建另一个元素列表。在您的示例中,您忽略输入元素0,1,...,n-1,并且只对生成的时间间隔输出元素感兴趣。不使用map的某些等效代码将是
var durations3: [TimeInterval] = []
for _ in 0..<n {
let date = Date()
// Code you want to measure.
durations3.append(abs(date.timeIntervalSinceNow))
}