Swift 中映射的静态方法包装器

问题描述 投票:0回答:1

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]

附注顺便问一下,这个功能官方是怎么称呼的?

swift static set mapping
1个回答
0
投票

假设您的意思是这样的实例方法:

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]
,因此它无法知道您要传递的闭包是否会抛出异常。因此,它保持安全并假设它会抛出。

© www.soinside.com 2019 - 2024. All rights reserved.