Я хочу вызвать функцию обратного вызова из собственного кода:
Из заголовка:
void load_all(Client *client,
void (*cb_result)(const ResponseWrapper*),
void (*cb_error)(char*));
Это мой обратный вызов в Swift:
let result: @convention(c) (UnsafePointer<ResponseWrapper>?) -> Void = { pointer in
if let ResponseWrapper = pointer?.pointee {
print("data \(data.length)")
}
}
Когда я попытаться вернуть результаты обратного вызова result
в swift. Я получил следующую ошибку:
A C function pointer cannot be formed from a closure that captures context
Как лучше всего преодолеть это ограничение?
Это единственный способ сохранить экземпляр моего класса в указатель, отправить его в собственный код и вернуть его к объекту?
let owner = UnsafeMutableRawPointer(Unmanaged.passRetained(callbackWrapper).toOpaque())
let owner: Response = Unmanaged.fromOpaque($0!).takeUnretainedValue()
Это тоже не работает:
func loadAll() {
//Loader class
let ownedPointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
let result: @convention(c) (UnsafePointer<ResponseWrapper>?) -> Void = { pointer in
if let ResponseWrapper = pointer?.pointee {
print("data \(data.length)")
}
let newSelf:Loader = Unmanaged.fromOpaque(ownedPointer).takeUnretainedValue()
}
}
Мое текущее решение:
- Swift : gist.github.com/xajik/fe360b705f63ceba4a71f94d1ce2dc41
- Ржавчина : gist.github.com/xajik/8b532c44e3a267a5d8ae450ea11ad41c