【问题标题】:Arbitrary C callback wrappers in SwiftSwift 中的任意 C 回调包装器
【发布时间】:2019-12-18 08:14:28
【问题描述】:

我有一个 C 库,表单中有很多回调

void asynchronous_thing(..., void* userInfo, SOMECBTYPE cb)

我正在 Swift/XCT 中为这些编写单元测试,并且想知道将 vars 传递到 Xcode/Swift 自动为我生成的闭包中的最佳解决方案是什么(我提供了一个答案,但我的 Swift 低于标准,所以很有可能有一种更优雅的方法来做到这一点)。

【问题讨论】:

    标签: c swift callback wrapper


    【解决方案1】:

    这是我的解决方案:

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多