2016-09-15 89 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的签名:■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] 

但通常它可能是更简单,只需提供在飞行封闭高阶功能,如filtersorted

+0

@TimVermeulen感谢编辑,它看​​起来像Swiftdoc.org:s自动生成的文档中列出的声明并不是最新的。 – dfri

+1

Swiftdoc不是由Apple制作的,它只是由解析标准库的头文件的人制作的。作者让我知道Swiftdoc已经过时了,因为他的解析器不支持一些语法变化,但它应该很快就会更新。 :) –

+0

@TimVermeulen我知道Swiftdoc是内特库克(非常棒)非官方的参考资料,但我不知道后者,由于他的解析器,它已经有些过时了。很高兴知道,谢谢! – dfri