2015-05-31 71 views
0

代碼:夫特:減少與閉合

 var treasures: [Treasure] = [] 
    treasures = [treasureA, treasureB, treasureC, treasureD, treasureE] 

    let rectToDisplay = self.treasures.reduce(MKMapRectNull) { 
     (mapRect: MKMapRect, treasure: Treasure) -> MKMapRect in 
     // 2 
     let treasurePointRect = MKMapRect(origin: treasure.location.mapPoint, size: MKMapSize(width: 0, height: 0)) 
     // 3 
     return MKMapRectUnion(mapRect, treasurePointRect) 
    } 

在上面的代碼中,我們所運行的減少對treasures陣列的功能,兩個參數被傳遞在閉合:(mapRect: MKMapRect, treasure: Treasure)。閉包如何知道第二個參數是來自treasures數組的元素,第一個參數是閉包返回的結果?

這是默認情況下,在閉包中傳遞的第二個參數將是數組中執行reduce函數的元素嗎?

回答

2

斯威夫特的數組類有reduce的定義,最有可能看起來是這樣的:

func reduce<T>(initial: T, fn: (T, T) -> T) -> T { 
    var val = initial 
    for e in self { 
     val = fn(val, e) 
    } 
    return e 
} 

也就是說,的reduce的定義決定了其參數傳遞給你提供的封閉順序。


需要注意的是斯威夫特的reduce的實際定義比我上面提供的一個更復雜,但上面的例子是最基本的要點。

1

如果你看一下減少的定義:

func reduce<S : SequenceType, U>(sequence: S, initial: U, combine: @noescape (U, S.Generator.Element) -> U) -> U

關閉的第一個參數是結果,第二個是你的序列的元素。