为什么
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
.
关于swift - Swift3 中的 Curried 闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508570/