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]
附注顺便问一下,这个功能官方是怎么称呼的?
假设您的意思是这样的实例方法:
class C {
func foo(x: T1, y: T2) -> R { ... }
}
也可以像这样调用静态方法:
class C {
static func foo(`self`: C) -> (T1, T2) -> R { ... }
}
这称为 currying,但仅限于第一个参数。通常柯里化
foo
(上图)意味着 func foo() -> (C) -> (T1) -> (T2) -> R
。
您可以像这样使用
map
的静态版本:
let numbers = Set([1, 2, 3])
let doubled = try Set.map(numbers)() { $0 * 2 }
print(doubled)
请注意
()
之后额外的 map(numbers)
。如果没有它,解析器会认为闭包是 Set.map
调用的参数。需要使用 ()
来明确闭包是由 map
返回的函数的参数。
您还需要
try
,因为 map
是用 rethrows
: 声明的
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
通常,
rethrows
表示如果transform
不抛出,map
也不会抛出。但由于 map
的静态版本仅接受 Set
并返回 ((Self.Element) throws -> T) -> [T]
,因此它无法知道您要传递的闭包是否会抛出异常。因此,它保持安全并假设它会抛出。