Swift 中的每个方法都有 Swift 自动生成的相应静态函数。
但我很难将这个概念应用到map
.
例如。这是一种规范的做事方式:
let numbers = Set([1, 2, 3])
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6]
我想要的是使以下代码编译和工作(因为理论上它应该像上面的代码一样编译和工作):
let numbers = Set([1, 2, 3])
let doubled = Set.map(numbers) { $0 * 2 }
print(doubled) // [2, 4, 6]
PS顺便问一下,这个功能官方是怎么称呼的?
假设您的意思是这样的实例方法:
也可以像静态方法一样调用,如下所示:
这称为柯里化,但仅限于第一个参数。通常柯里化
foo
(上面)意味着func foo() -> (C) -> (T1) -> (T2) -> R
. 另请参阅:https://stackoverflow.com/a/25375190/5133585map
您可以使用这样的静态版本:()
注意后面的多余的map(numbers)
。如果没有它,解析器会认为闭包是调用的参数Set.map
。需要()
来明确闭包是所返回函数map
的参数。您也不能使用尾随闭包语法:您还需要
try
,因为map
是用以下方式声明的rethrows
:通常,
rethrows
意味着如果transform
不抛出,map
也不抛出。但由于 的静态版本map
仅接受 aSet
并返回 a((Self.Element) throws -> T) -> [T]
,因此它无法知道您要传递的闭包是否会抛出异常。因此,它保持安全并假设它会抛出。