2015-05-31 5 views
0

Код:Swift: Снизить с закрытием

 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, и первый параметр будет результатом того, что возвращается это закрытие?

Это что-то по умолчанию, что вторым параметром, переданным в закрытии, будет элемент из массива, который выполняет функцию уменьшения?

ответ

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

Первый параметр закрытия является результатом, а второй является элементом вашей последовательности.

Смежные вопросы