let arr = [1,2,3,4,5]
let filtered = arr.filter { $0 < 3 }
为什么不呢?
let filtered = arr.filter(<3)
如果我可以使用操作功能:
[1,2,3].sorted(by: >)
let arr = [1,2,3,4,5]
let filtered = arr.filter { $0 < 3 }
为什么不呢?
let filtered = arr.filter(<3)
如果我可以使用操作功能:
[1,2,3].sorted(by: >)
的Sequence
的签名:■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
。
因为'<'是一个函数而'<3'不是。 –
@MartinR确实,'<3'太复杂了,以至于无法用函数表示,甚至是一个特殊用途的;) – dfri