2016-09-15 95 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