Swift: сокращение с закрытием

58
6

Код:

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

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

спросил(а) 2015-06-01T01:22:00+03:00 5 лет, 4 месяца назад
1
Решение
71

Класс класса Swift имеет определение 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 определяет порядок, в котором параметры передаются в закрытие, которое вы предоставляете.

Следует отметить что фактическое определение Swift reduce является более сложным чем я представленным выше, но в приведенном выше примере это основная суть.

ответил(а) 2015-06-01T02:03:00+03:00 5 лет, 4 месяца назад
57

Если вы посмотрите на определение сокращения:

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

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

ответил(а) 2015-06-01T01:46:00+03:00 5 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема