gpt4 book ai didi

swift - 带有@escaping 参数的类初始化器

转载 作者:搜寻专家 更新时间:2023-11-01 06:53:30 25 4
gpt4 key购买 nike

我正在设置一个可以理想地存储异步方法供以后使用的类。我想在类初始值设定项中传递一个函数,但我遇到了一个奇怪的编译器问题。

无法将类型“(@escaping (Int) -> Void) -> ()”的值转换为预期的参数类型“((Int) -> Void) -> Void”

如果该方法没有转义/同步,则可以正常工作。编译器还建议强制将参数 强制转换为! (((Int) -> 无效) -> 无效)。试了一下,但它崩溃了。

这是我在 Playground 上玩过的一个例子:

class NumberTwo {
let numberTwoMethod: ((Int) -> Void) -> Void

init(numberTwoMethod: @escaping ((Int) -> Void) -> Void) {
self.numberTwoMethod = numberTwoMethod
}

func callNumberTwoMethod() {
numberTwoMethod { myNum in
print(myNum)
}
}
}

func getNumberTwoMethod(completion: @escaping (Int) -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
completion(2)
}
}

func getNumberTwoMethodSync(completion: (Int) -> Void) {
completion(2)
}

NumberTwo(numberTwoMethod: getNumberTwoMethod) // error: cannot convert value of type '(@escaping (Int) -> Void) -> ()' to expected argument type '((Int) -> Void) -> Void'
NumberTwo(numberTwoMethod: getNumberTwoMethodSync) // Works

关于这里发生的事情或将异步函数存储为类中的变量的替代方法有什么建议吗?

最佳答案

您在内部闭包中缺少 @escaping:

class NumberTwo {
let numberTwoMethod: (@escaping (Int) -> Void) -> Void

init(numberTwoMethod: @escaping (@escaping (Int) -> Void) -> Void) {
self.numberTwoMethod = numberTwoMethod
}

func callNumberTwoMethod() {
numberTwoMethod { myNum in
print(myNum)
}
}
}

或略微简化:

class NumberTwo {
typealias CompletionHandler = (Int) -> Void
let numberTwoMethod: (@escaping CompletionHandler) -> Void

init(numberTwoMethod: @escaping (@escaping CompletionHandler) -> Void) {
self.numberTwoMethod = numberTwoMethod
}

func callNumberTwoMethod() {
numberTwoMethod { myNum in
print(myNum)
}
}
}

另请注意,这可能会造成内存泄漏,因为任何地方都没有 weak

关于swift - 带有@escaping 参数的类初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55502398/

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