swift - Swift3 中的 Curried 闭包?

标签 swift closures swift3 currying

为什么

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/

相关文章:

循环内的 JavaScript 闭包——简单实用的例子

ios - Xcode Storyboard用蓝色遮盖了 uitabbarcontroller 元素

ios - 字典中的字符串值是字符串的两倍

php - 将数据传递给 PHP 的选项有哪些?

python - Python中列表理解中的闭包

php - 如何使用匿名函数和闭包正确设置 PDO 连接

ios - 如何将新对象插入到实体中并设置该对象与另一个实体的现有对象的关系?

ios - 在 swift 3 中按钮位置变化出错

swift - 从一个 View 移动到另一个 View 时,tvOS 应用程序出现焦点问题

swift - 在Swift中实现密封类的效果