2017-04-06 79 views
1

useyourloaf.com/blog/swift-guide-to-map-filter-reduce/我怎樣寫在迅速

嵌套地圖代碼我使用這個網站來了解地圖如何幫助斯威夫特看着工作,以及來自各種框架的代碼。 (我在實踐中學習更好)

現在,我期待在框架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

我的問題是,是否有可能重寫而不使用函數? 我有什麼下面當您使用map給我的

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

錯誤,參數關閉將是「東西」你在使用map的類型。 0..<n是包含0,1,...,n-1的CountableRange<Int>,因此參數將是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,只對生成的時間間隔輸出元素感興趣。有點類似代碼不使用地圖將

var durations3: [TimeInterval] = [] 
for _ in 0..<n { 
    let date = Date() 
    // Code you want to measure. 
    durations3.append(abs(date.timeIntervalSinceNow)) 
} 
+0

已經有一段時間,因爲我與SWIFT修修補補的話,遺憾的響應晚,但這確實幫助我瞭解了一下更好。謝謝 – Sara