【发布时间】:2021-12-30 11:31:50
【问题描述】:
我被一些 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
【问题讨论】:
-
你知道trailing closures吗?
-
它的语法与
anIntInTwoSeconds.run { theInt in行完全相同。你明白那句台词吗? -
让我确认我确实理解 .run 行... run 是一个返回 Void 的函数。它接受一个函数。该函数接受一个 Int 并返回 Void。所以那行说,嘿,运行,执行这个函数。如果那是正确的,我在另一行仍然很模糊。
-
我会换一种说法。 Run 是一个持有闭包的属性。 (一个匿名函数。)run 闭包的参数是 Generic,这意味着传递给闭包的参数取决于用于创建 Effect 结构的类型。
-
(因此
Effect<Int>结构的运行参数是(Int) -> Void类型的闭包。Effect<String>结构的运行参数将是(String) -> Void类型。)
标签: swift functional-programming