gpt4 book ai didi

swift - 如何在嵌套的不可抛出闭包中调用 throw?

转载 作者:搜寻专家 更新时间:2023-10-31 23:07:41 27 4
gpt4 key购买 nike

我有这个功能:

func getOptionalConfigurations(_ configurations: ([String]?, Error?) -> Void) {

// DO SOMETHING
}

我需要用另一个类似的方式包装它:

func retrieveConfigurations(_ completion:@escaping (([String]?) throws -> Void)) rethrows {

getOptionalConfigurations { (configurations: [String]?, error: Error?) in

do {

try completion(configurations)

} catch {

throw error
}
}
}

但是我得到了这个错误:

Invalid conversion from throwing function of type '([String]?, Error?) throws -> ()' to non-throwing function type '([String]?, Error?) -> Void'

我同意这个错误,但我还是想抛出这个错误!我没有机会更改这个函数:getOptionalConfigurations

编辑:第一个函数是 ObjC 函数的翻译,我最多可以修改方法签名,添加类似 NS_SWIFT

的内容
- (void)getOptionalConfigurations:(void (^)(NSArray <NSString *> * _Nullable configurations, NSError * _Nullable error))completion;

最佳答案

如果您不能更改函数 getOptionalConfigurations,那么您就不能从函数内部抛出异常,因为没有任何东西会处理您抛出的错误。

但是如果你想在不改变现有架构的情况下从外部函数中抛出错误,我只能提出一个非常糟糕的解决方案:

func retrieveConfigurations(_ completion:@escaping (([String]?) throws -> Void)) throws {
let d = DispatchGroup()
var errorToThrow: Error?

d.enter()
getOptionalConfigurations { (configurations: [String]?, error: Error?) in
do {
try completion(configurations)
d.leave()
} catch {
errorToThrow = error
d.leave()
}
}

d.wait(timeout: .now() + 10)

if let error = errorToThrow {
throw error
}
}

这很糟糕,因为如果 getOptionalConfigurations 异步执行,那么当前线程将不得不等待它完成。我还添加了 10 秒的超时。您可以将其更改为无穷大,这会使情况变得更糟,或者只更改秒数。

关于swift - 如何在嵌套的不可抛出闭包中调用 throw?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48606763/

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