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