Swift: указатель на функцию C не может быть сформирован из замыкания, которое захватывает контекст. - PullRequest
0 голосов
/ 05 мая 2020

Я хочу вызвать функцию обратного вызова из собственного кода:

Из заголовка:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...