我如何在swift中编写嵌套的地图代码

时间:2017-04-06 18:30:53

标签: swift3

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)
    })

1 个答案:

答案 0 :(得分:0)

当你使用map时,闭包的参数将是&#34; stuff&#34;的类型。您正在使用map0..<nCountableRange<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))
}