不确定这个 Swift 带闭包的结构语法

Uncertain of this Swift struct syntax with closure

我被一些 Swift 结构语法难住了。

对于常规结构,我了解如何定义和初始化它。

struct Thing {
    let name: String
}

let aThing = Thing(name: "The Name")

但我阅读了一些有关函数式编程的内容并遇到了这种语法,最让我难过的是初始化。

struct Effect<T> {
    let run: (@escaping (T) -> Void) -> Void
}

// What is "callback" here? How does this work?
let anIntInTwoSeconds = Effect<Int> { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        callback(42)
    }
}

anIntInTwoSeconds.run { theInt in
    print(theInt)
}

如果我用“普通”初始化程序看到它,我会理解它,但是这一行发生了什么?这个语法叫什么,所以我可以进一步研究它?

let anIntInTwoSeconds = Effect<Int> { callback in

Effect type

的声明
struct Effect<T> {

将 Effect 定义为使用通用类型 T。因此您可以创建适用于不同类型的 Effect 对象。

let anIntInTwoSeconds = Effect<Int> { callback in

创建一个对 Int 进行操作的 Effect 对象,并将其赋值给变量 anIntInTwoSeconds

{ callback in 部分定义了 Effect 对象的闭包。该声明可以这样重写:

let anIntInTwoSeconds = Effect<Int>(run: { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        callback(42)
    }
}
)

你可以理解为:

'Create an instance of the Effect struct, with a run property that contains the closure that begins with "{ callback in"...'

(这很令人困惑,因为 运行 属性 本身就是一个闭包。所以我们创建了一个 Effect 实例,并传递给它一个“运行”值,它是一个闭包.)

“callback in”部分具体告诉编译器,在该闭包内部,闭包的参数应命名为“callback”。