Настоящий ответ показывает, как решить Bridging Header
#import
, и представляет собой пошаговое руководство по созданию объекта оболочки Objective-C
.
.mm не означает, что Swift
.mm не означает, что Objective-C либо
Это означает Objective-C++
, а просто переименовать файл в .mm
не предлагает никаких улучшений. Обратите внимание, что вы все еще включаете в себя те же файлы .h
, и находятся там, где проблема начинается с. Эти .h
ссылки C++
классы, и они должны быть обернуты.
Оберните C++ в Objective-C
Файл AudioController.h
не является Objective-C
файл: он включает в себя BufferManager.h
, который является C++
файл и компиляция останавливается там.
Вам нужно создать настоящую оболочку, скажем, AudioControllerBridge
который .h
находится в Objective-C
и .mm
может, в свою очередь, делают ссылки на C++
:
.h
Абсолютно положительно не C++
не допускаются , явным, включенным или другим.
#import <Foundation/Foundation.h>
@interface AudioControllerBridge : NSObject
// ...
@end
.mm
Objective-C++
переносит все C++
вам нужно, пока она не подвергается в интерфейсе.
#import "AudioControllerBridge.h"
#import "AudioController.h"
@implementation AudioControllerBridge
// ...
@end
Конечно, можно просто модифицировать AudioController.h
напрямую, но мы будем рассматривать это плохая практика: за остальную часть этого ответа, мы будем считать, что вы пытаетесь интегрировать aurioTouchкак есть, с точно 0 линий с кодом изменено.
В реализации из AudioControllerBridge
, теперь вы можете создать экземпляр AudioController
и импортировать все C++
файлы, необходимые для правильной компиляции, то вы не могли бы сделать в .h
. Помните, что .h
вы подвергаете воздействию Swift в Briding-Header
должен быть чистым интерфейсом Objective-C
.
// Bridging Header
#import "AudioControllerBridge.h"
ARC
Вы скоро увидите, что вам необходимо скачать CoreAudio/PublicUtility, потому что некоторые файлы, такие как CADebugPrintf
просто отсутствуют из примера, и как-то не будет строить в своем новом проекте, по крайней мере, DEBUG
режим.
Если вы сделали это до сих пор, вы тогда узнаете, что вы получите с десяток устаревших предупреждений , которые вы можете игнорировать сейчас, и вдвое меньше, чем ARC ошибок в AudioController.mm
. Fix с -fno-objc-arc
Compiler Флаг:
Если вы сделали это до сих пор (реквизита), и добавил:
Accelerate.framework
AudioToolbox.framework
AVFoundation.framework
к вашей цели в Сборка фаз и скомпилирована, вы обнаружите, что она строит и звенья.
Обертывание его
Он взял меня 1h 47mins, чтобы достичь этой точки (доказательство ниже). Следующий шаг, конечно, на самом деле поместить код обертки в AudioControllerBridge
, так что она возвращает (обручи):
BufferManager* _bufferManager;
DCRejectionFilter* _dcRejectionFilter;
- (BufferManager*) getBufferManagerInstance;
которые являются 3 не- Objective-C
элементы в этом class
.
Это может быть чище, чтобы обернуть BufferManager
и DCRejectionFilter
, а также, так что они могут быть свободно использованы в Swift. Я разрешу это решение читателю.
Demo
Просто для записи, все выше инструкции приводят к успешной компиляции
let ac = AudioControllerBridge()
, как показано на скриншоте. Она показывает всех файлов, необходимых, и показать успешную сборку на Xcode 7 для iPhone 6 на прошивке 9.
Покажите нам ваши списки файлов и сами файлы, пожалуйста –
@JasonNam я создал и обновлены простым быстрое приложение, использующее библиотеку aurioTouch, спасибо. –
Я думаю, что заголовок заголовка не работает правильно. Можете ли вы подтвердить, что заголовок моста зарегистрирован соответствующим образом? –