Похоже, диапазон не используется.
Когда вызывается фильтр метода, он использует замыкание.Это замыкание является методом, который имеет определенную «форму», которая является
func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
. В этом коде вы видите сокращенный синтаксис, который позволяет вам указать аргумент Element.
Итак,filter
примет каждое значение в диапазоне от 1 до 9 и передаст его закрытию фильтра, где будет проверяться, делится ли оно точно на 3 или 5.
Более длинный способ записи будет:
func f(num: Int) -> Bool {
return (num % 3 == 0) || (num % 5 == 0)
}
(1...9).filter(f)
где f
- определенная нами функция.
Часть reduce
немного сложнее, потому что функция reduce
принимает начальный результат и замыкание.
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
Стрелка для полного кода выглядит как
func f(num: Int) -> Bool {
return (num % 3 == 0) || (num % 5 == 0)
}
func r(x: Int, y: Int) -> Int {
return x + y
}
(1...9).filter(f).reduce(0, r)
И чтобы немного повеселиться, мы можем написать это
(1...9).filter { ($0 % 3 == 0) || ($0 % 5 == 0) }.reduce(0, { $0 + $1 })
Где конструкция $ nссылка на переданный n-й аргумент. Время от времени вы можете видеть это всплывающее окно.