XCTAssertNoThrow 在闭包中调用时不编译

Posted

技术标签:

【中文标题】XCTAssertNoThrow 在闭包中调用时不编译【英文标题】:XCTAssertNoThrow doesn't compile when called in closure 【发布时间】:2018-01-28 15:27:31 【问题描述】:

试图编译一个测试用例,其中XCTAssertNoThrow 在闭包中使用,但没有成功。为什么这么死板,是重新抛出还是怎么回事?

let e = expectation(description: "Wait")

distillery.produce(request: Request(bottles: 1337))  (result) in // error
  XCTAssertNoThrow(try result.unwrap())

  e.fulfill()

Xcode 在编译时抛出错误:

'(_) throws -> ()' 类型的抛出函数的无效转换 到非抛出函数类型 '(Result) -> Void'

ps:我认为这似乎是 Swift 中的一个错误 https://bugs.swift.org/browse/SR-487

【问题讨论】:

唉,这是 Xcode。事实上,似乎是自动关闭导致了问题。 【参考方案1】:

通过将 XCTAssertNoThrow 包装到辅助函数中解决了这个问题

func assertOk<T>(_ result: Result<T>, file: StaticString = #file, line: UInt = #line) 
    XCTAssertNoThrow(try result.unwrap(), file: file, line: line)

【讨论】:

在 Xcode 10.1 中仍然是一个问题。感谢您的解决方法! Result 类型是什么? @Ruben enum Result&lt;T, E&gt; case success(T), failure(E) 。对unwrap() 的调用要么返回T,要么抛出E Xcode 10.2.1:我担心,我们必须坚持使用这种解决方法一段时间。

以上是关于XCTAssertNoThrow 在闭包中调用时不编译的主要内容,如果未能解决你的问题,请参考以下文章

异步调用的空闭包

在 WASM-Bindgen Rust 中使用鼠标输入事件闭包创建回调时出现闭包调用错误

为啥没有通过在 promise 中调用的函数内部的闭包来定义解析?

在闭包中调用函数时的快速强链接

MSIL实用指南-闭包的生成和调用

JavaScript-也来谈--闭包