【发布时间】:2019-12-18 08:14:28
【问题描述】:
我有一个 C 库,表单中有很多回调
void asynchronous_thing(..., void* userInfo, SOMECBTYPE cb)
我正在 Swift/XCT 中为这些编写单元测试,并且想知道将 vars 传递到 Xcode/Swift 自动为我生成的闭包中的最佳解决方案是什么(我提供了一个答案,但我的 Swift 低于标准,所以很有可能有一种更优雅的方法来做到这一点)。
【问题讨论】:
我有一个 C 库,表单中有很多回调
void asynchronous_thing(..., void* userInfo, SOMECBTYPE cb)
我正在 Swift/XCT 中为这些编写单元测试,并且想知道将 vars 传递到 Xcode/Swift 自动为我生成的闭包中的最佳解决方案是什么(我提供了一个答案,但我的 Swift 低于标准,所以很有可能有一种更优雅的方法来做到这一点)。
【问题讨论】:
这是我的解决方案:
class CUserInfoClass<T> {
let v: T
init(_ v: T) {
self.v = v
}
init(_ userInfo: UnsafeMutableRawPointer) {
self.v = CUserInfoCallback<T>(userInfo).v.v
}
}
class CExpectation : CUserInfoClass<XCTestExpectation> {
func fulfill() {
self.v.fulfill()
}
}
class CUserInfoCallback<T> {
let v: CUserInfoClass<T>
init(_ v: CUserInfoClass<T>) {
self.v = v
}
init(_ userInfo: UnsafeMutableRawPointer) {
self.v = Unmanaged<CUserInfoClass<T>>.fromOpaque(userInfo).takeUnretainedValue()
}
func wrap() -> UnsafeMutableRawPointer {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(self.v).toOpaque())
}
}
我以下列方式使用它:
func testAsyncThingie() {
let exp = CUserInfoCallback(CUserInfoClass(expectation(description: "Wait for async thingie")))
DoAsyncThing(exp.wrap()) {
(ui, err) in
XCTAssertNil(err)
CExpectation(ui!).fulfill()
}
waitForExpectations(timeout: 10, handler: nil)
}
DoAsyncThing 在哪里
void DoAsyncThing(void*, void (*)(void* userInfo, const char* error))
【讨论】: