2015-09-09 1 views
3

Я пытаюсь преобразовать приложение Objective-C в swift.Импорт библиотеки aurioTouch с быстрым

Я хотел бы импортировать классы aurioTouch Свифт приложения, так что я создал следующий файл Bridging-заголовка:

#import "AudioController.h" 

, но я получил следующие ошибки в DCRejectionFilter.h, BufferManager.h, FFTHelper. h:

Неизвестный тип name 'class'; вы имели в виду «класс»?

Ожидаемый ';' после того, как верхний уровень описателя

, а также в AudioController.h:

Неизвестное имя типа '' BufferManager

имя Неизвестный тип 'DCRejectionFilter'

Конечно я использую. мм вместо .m, но это не работает.

обновление

Простой быстрый проект только в том числе aurioTouch библиотеки (с Obj-C и C++) выглядит следующим образом: https://github.com/pika-shi/aurioTouch-Sample

+0

Покажите нам ваши списки файлов и сами файлы, пожалуйста –

+0

@JasonNam я создал и обновлены простым быстрое приложение, использующее библиотеку aurioTouch, спасибо. –

+0

Я думаю, что заголовок заголовка не работает правильно. Можете ли вы подтвердить, что заголовок моста зарегистрирован соответствующим образом? –

ответ

6

Настоящий ответ показывает, как решить 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-arcCompiler Флаг:

enter image description here

Если вы сделали это до сих пор (реквизита), и добавил:

  • 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.

Build Successful

+1

Отлично, я смог использовать audioController из swift. Спасибо в любом случае за большую помощь! –

+0

Любая возможность вообще поделиться тем, что я пропустил, и что еще нужно сделать? Вы создали «AudioControllerBridge»? Кроме того, спасибо за √: это было много исследований! – SwiftArchitect

+0

Ваш ответ абсолютно совершенен, и я сделал все, что вы сказали, и создал «AudioControllerBridge». Я был действительно спасен :) –

 Смежные вопросы

  • Нет связанных вопросов^_^