Swift не может найти определение частной структуры в фреймворке

У меня возникла проблема при использовании функции swift-bridge-header для доступа к структуре кода c (liblinphone). Структура LinphoneCallParams, определенная в types.h, которую можно найти в заголовочных файлах фреймворка. И определение структуры выглядит следующим образом

typedef struct _LinphoneCallParams LinphoneCallParams; 

Когда я пытаюсь определить параметр

var callPara: LinphoneCallParams? 

в файле swift Xcode покажет это уведомление об ошибке «Использование необъявленного типа« LinphoneCallParams »». (Нет проблем с доступом к другому определению в этом файле, поэтому файл заголовка swift-briging без проблем) Найдите определение _LinphoneCallParams, которое находится в private.h, не включенном в SDK. Но интересно то, что если я использую код Object-C для определения этого параметра

LinphoneCallParams *callParams = xxxxxxx();

Все работает правильно. Я не хочу использовать код Object-C для реализации этого проекта. Любая идея, почему это происходит?


person Angus    schedule 20.04.2018    source источник


Ответы (1)


Связующий компилятор довольно агрессивно отбрасывает то, что, по его мнению, не должно быть там.

Если struct _LinphoneCallParams на самом деле не существует, то соответствующий typedef/typealias не попадет в сгенерированный заголовок.

Сравните эти два примера.

struct _BoodleParams существует:

введите здесь описание изображения

И делает это:

class Thing {
    var boodle = _BoodleParams(foo: 3, bar: 4)
    var doodle = _BoodleParams(foo: 2, bar: 1)
}

Или это:

class Thing {
    var boodle = BoodleParams(foo: 3, bar: 4)
    var doodle = BoodleParams(foo: 2, bar: 1)
}

одинаково действительный код.

Однако, когда вы устраняете необходимость существования typedef в ответной части, он удаляется во время процесса соединения.

введите здесь описание изображения

Обратите внимание, что пока символ _BoodleParams существует где-то в скомпилированном Objective-C, typedef будет переноситься в аналог.

введите здесь описание изображения

Таким образом, причина, по которой LinphoneCallParams не может быть создан в вашем коде Swift, заключается в том, что либо символ struct _LinphoneCallParams не виден системе мостов, либо он еще не существует.

person Warren Burton    schedule 20.04.2018