Every method in Swift has correspondent static function generated by Swift automatically.
But I'm having hard times to apply this concept for map.
For example. This is a canonical way of doing things:

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.另见:https://stackoverflow.com/a/25375190/5133585

您可以使用map的静态版本,如下所示:

let numbers = Set([1, 2, 3])
let doubled = try Set.map(numbers)() { $0 * 2 }
print(doubled)

请注意,map(numbers)之后的额外().如果没有它,解析器会认为闭包是Set.map调用的参数.需要()来清楚地表明,关闭是function returned bymap的参数.您也不能使用尾部闭合语法:

try Set.map(numbers)({ $0 * 2 })

您还需要try,因为map是用rethrows声明的:

func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]

正常情况下,rethrows意味着如果transform不投,map也不投.但是,由于map的静态版本只接受Set并返回((Self.Element) throws -> T) -> [T],它无法知道您要传递的闭包是否抛出.因此,它留在安全的一边,并假设它会抛出.

Swift相关问答推荐

VisionOS发送通知

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

SwiftUI轨迹绘制怪异

为SwiftUI文本视图提供固定宽度,并仅在文本换行时使文本视图底部增大

如何使 onKeyPress 与 TextField 快速配合使用?

Swift数据关系

UIView.convert(_ point:to:)的意外行为

CardStack 和 Lottie

在PrimitiveSequence上引用实例方法xxx需要类型A和any B等效

确定路径是否相交的有效方法

无法使用 RealityKit 播放 USDZ 动画

为 SwiftUI 中的属性提供默认值

Swift 非参与者隔离闭包

使用列表的下一项更新相同的视图

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

如何使用 Swift/iOS 为人类书写的笔画制作动画?

在 Swift 中将计时器标签格式化为小时:分钟:秒

SwiftUI - 呈现工作表后导航栏按钮不可点击

如何交换快速数组中的元素?

使用 JSONEncoder 对类型为 Codable 的变量进行编码