不确定这个 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”。
我被一些 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”。