如何使用这样的闭包参数初始化结构体?

2024-04-02

In 这个问题 https://stackoverflow.com/questions/70039118/uncertain-of-this-swift-struct-syntax-with-closure/70039340?noredirect=1#comment123810935_70039340我今天看到它定义了一个结构体Effect拥有财产的run这是一个带有通用参数的闭包:

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

然后示例代码创建一个实例Effect<Int>,并指定闭包run具有类似于尾随闭包语法的属性:

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

是什么让这合法?我希望需要在调用 init 方法时显式指定运行参数:

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

任一版本均可编译并运行。 Swift 中的什么使第一个版本合法?我不知道如何提出这个问题以便我可以寻找答案。


这就像任何最后一个参数是函数的函数一样。尾随闭包语法是尾随闭包语法。该函数是一个初始化器这一事实没有改变。

所以让我分阶段进行。你知道你可以说:

func myfunc(whatever: () -> ()) {}
myfunc {}

好的,但现在让我们将其设为静态方法:

struct S {
    static func myfunc(whatever: () -> ()) {}
}
S.myfunc {}

OK, but init is静态方法 - 它只是一个静态方法,您可以省略其名称:

struct S {
    let whatever: () -> ()
}
S {} // meaning S.init {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用这样的闭包参数初始化结构体? 的相关文章

随机推荐