2016-09-15 9 views
0

ПочемуЗамедленные закрытия в Swift3?

let arr = [1,2,3,4,5] 
let filtered = arr.filter { $0 < 3 } 

и почему нет?

let filtered = arr.filter(<3) 

, если я могу использовать функцию оператора:

[1,2,3].sorted(by: >) 
+2

Потому что '<' - это функция, а '<3' - нет. –

+2

@MartinR действительно, '<3' слишком сложна, чтобы когда-либо быть представимой функцией, даже для специального назначения;) – dfri

ответ

2

Подписи Sequence: S filter(...) и sorted(...) являются

func filter(_ isIncluded: (Self.Iterator.Element) throws -> Bool) rethrows -> [Self.Iterator.Element] 

func sorted(by areInIncreasingOrder: (Self.Iterator.Element, Self.Iterator.Element) -> Bool) -> [Self.Iterator.Element] 

Оба метода ожидают закрытия в качестве аргумента; бывший тип (Self.Iterator.Element) -> Bool, а второй тип (Self.Iterator.Element, Self.Iterator.Element) -> Bool). < - функция, выполняющая последние для Comparable типов (в частности, (Int, Int) -> Bool в вашем примере), тогда как <3 не является закрытием.

Вы можете определить свою собственную функцию, специально для этой цели (спасибо @vacawama)

func lessThan(_ value: Int) -> ((Int) -> Bool) { 
    return { $0 < value } 
} 

let arr = [1,2,3,4,5] 
let filtered = arr.filter(lessThan(3)) 
print(filtered) // [1, 2] 

Но в целом это может быть более простым, чтобы просто поставить затвор на лету функций высшего порядка, таких как filter и sorted ,

+0

@TimVermeulen спасибо за редактирование, похоже, как декларации, перечисленные в Swiftdoc.org: автогенерированная документация не совсем современна. – dfri

+1

Swiftdoc не сделан Apple, это просто сделано кем-то, разбирающим файл заголовка стандартной библиотеки. Автор сообщил мне, что Swiftdoc устарел, потому что его синтаксический анализатор не поддерживает некоторые синтаксические изменения, но он должен быть скоро обновлен. :) –

+0

@TimVermeulen Я знал, что Swiftdoc является (удивительной) неофициальной ссылкой Nate Cook, но я не знал последнего, что он немного устарел из-за его синтаксического анализатора. Замечательно, спасибо! – dfri