ПочемуЗамедленные закрытия в Swift3?
let arr = [1,2,3,4,5]
let filtered = arr.filter { $0 < 3 }
и почему нет?
let filtered = arr.filter(<3)
, если я могу использовать функцию оператора:
[1,2,3].sorted(by: >)
ПочемуЗамедленные закрытия в Swift3?
let arr = [1,2,3,4,5]
let filtered = arr.filter { $0 < 3 }
и почему нет?
let filtered = arr.filter(<3)
, если я могу использовать функцию оператора:
[1,2,3].sorted(by: >)
Подписи 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
,
@TimVermeulen спасибо за редактирование, похоже, как декларации, перечисленные в Swiftdoc.org: автогенерированная документация не совсем современна. – dfri
Swiftdoc не сделан Apple, это просто сделано кем-то, разбирающим файл заголовка стандартной библиотеки. Автор сообщил мне, что Swiftdoc устарел, потому что его синтаксический анализатор не поддерживает некоторые синтаксические изменения, но он должен быть скоро обновлен. :) –
@TimVermeulen Я знал, что Swiftdoc является (удивительной) неофициальной ссылкой Nate Cook, но я не знал последнего, что он немного устарел из-за его синтаксического анализатора. Замечательно, спасибо! – dfri
Потому что '<' - это функция, а '<3' - нет. –
@MartinR действительно, '<3' слишком сложна, чтобы когда-либо быть представимой функцией, даже для специального назначения;) – dfri