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 类型是什么? @Rubenenum Result<T, E> case success(T), failure(E)
。对unwrap()
的调用要么返回T
,要么抛出E
。
Xcode 10.2.1:我担心,我们必须坚持使用这种解决方法一段时间。以上是关于XCTAssertNoThrow 在闭包中调用时不编译的主要内容,如果未能解决你的问题,请参考以下文章
在 WASM-Bindgen Rust 中使用鼠标输入事件闭包创建回调时出现闭包调用错误