gpt4 book ai didi

ios - Swift @escaping 仅适用于非空函数参数?

转载 作者:行者123 更新时间:2023-12-02 03:16:19 25 4
gpt4 key购买 nike

我从来没有真正理解何时在 Swift 中使用@escaping。我理解它的作用(即转义闭包和非转义闭包之间的区别),但是我一直依赖 Xcode 来告诉我何时将修饰符添加到我的参数中。

我的问题是,为什么@escaping只适用于非零闭包?这就是我的意思:

func someFunc(someArg: Int, callback: @escaping (Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
...
}
}

在上面,如果我不添加 @escaping Xcode 会给我一个错误。但是,如果我将 callback 设置为可选,如下所示,保留 @escaping 会导致 Xcode 错误:

// This is wrong (Xcode complains about @escaping)
func someFunc(someArg: Int, callback: @escaping ((Error?) -> Void)?) {
DispatchQueue.global(qos: .background).async {
...
}
}

这是为什么呢?谢谢!

最佳答案

正如您所知,默认情况下,闭包参数无法转义。您必须添加 @escaping让他们逃脱。请参阅here了解闭包逃逸意味着什么。

更准确的措辞是,函数参数位置中的闭包默认情况下是非转义的。如您所知((Error?) -> Void)?Optional<(Error?) -> Void> 的语法糖。这里,闭包类型不在“函数参数位置”。它用作泛型类型Optional的泛型参数。 。这只是我的观点,但你不认为@escaping Optional<(Error?) -> Void>似乎将可选标记为“转义”?

对于更极端的情况,元组怎么样?如何仅将一对闭包中的第一项标记为转义?另外,如果我有 T<(Error?) -> Void> ,是否保证它一定会存储闭包的实例?我的意思是,它只是一个通用类型:

class Foo<T> {}

let a: Foo<(Int) -> Int> = Foo()

应该做什么@escaping那么在这个结构上做什么?

最后,没有一个包含在 Optional 中的闭包吗? 已经逃到了 Optional

也许是因为需要设计、实现和测试的东西太多,Swift 团队只是在可选值和元组中实现了所有闭包,以及隐式转义的其他泛型类型。

另请参阅:SR-2444

关于ios - Swift @escaping 仅适用于非空函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com