Чего не хватает после перехода Obj-C на Swift

Я делал это раньше, обычно без проблем, устанавливая заголовок моста и т. д.
На этот раз я попытался импортировать фреймворк Obj-C (github.com/jensmeder/FSKModem/) в свой быстрый проект. При вводе кода я могу «видеть» все методы Obj-C.
Но когда я компилирую код, я получаю ошибки типа "Использование необъявленного идентификатора "удалить"" или "Использование необъявленного идентификатора "новый"". Пример кода в файле .m, который выдает ошибку:

    _audioFormat = new AudioStreamBasicDescription();


Я знаком со Swift и не знаю об Obj-C, но я думаю, что «удалить» или «новый» должны существовать, верно? Принадлежат ли они к какой-то структуре, которую я должен добавить? Я могу без проблем скомпилировать исходный код в Obj-C, но мне нужно включить его в свой проект, написанный на Swift.
Большое спасибо за любую помощь

Еще немного информации... Следующие функции находятся внутри .m файла. Знаете ли вы, почему ключевые слова «новое» и «удалить» не распознаются? Это отлично работает при компиляции как обычный проект «Obj-C». Ошибка появляется только в проекте Swift (конечно, после соединения заголовков):

-(void)dealloc
{
[self disconnect:NULL];

if (_audioFormat)
{
    delete _audioFormat;
}
}

-(void) setupAudioFormat
{
_audioFormat = new AudioStreamBasicDescription();
//...
}

Должен ли я добавить какой-то #include, который мне может не хватать, помимо Foundation?


person Duarte    schedule 05.01.2016    source источник


Ответы (3)


new и delete — ключевые слова C++; вы можете использовать их в файлах C++ (обычно .cpp или .cc) и в файлах Objective-C++ (всегда .mm). Вы не можете использовать их в файлах Swift (.swift) или Objective-C (.m).

Вполне допустимо использовать класс Objective-C из файла Objective-C++ из Swift; вы можете использовать Objective-C для переноса классов C++ для использования Swift. Однако использование C++ из простого Objective-C недопустимо.

Вполне возможно, вам просто нужно переименовать файл Objective-C в .mm.

person Tommy    schedule 05.01.2016
comment
Привет, следуя вашему предложению, вместо этого я получаю следующую ошибку: Неопределенные символы для архитектуры x86_64: (затем их большой список). - person Duarte; 05.01.2016
comment
Мне удалось скомпилировать. Только что начал все сначала с пустого проекта и воспользовался вашей подсказкой, чтобы переименовать в .mm Большое спасибо! - person Duarte; 05.01.2016

new и delete — это ключевые слова C++, а не Swift или Objective-C.

Быстрый

let audioFormat = AudioStreamBasicDescription()

Цель-C

AudioStreamBasicDescription* audioFormat = [[AudioStreamBasicDescription alloc] init];
person orkoden    schedule 05.01.2016
comment
Спасибо. Эта часть кода находится внутри файла .m. Разве я не могу использовать эту библиотеку, не касаясь ее содержимого? - person Duarte; 05.01.2016

В Swift вам просто нужно вызвать инициализатор объекта при создании объекта.

_audioFormat = AudioStreamBasicDescription()

Ключевое слово new представляет собой комбинацию Objective-C alloc и init.

person bbarnhart    schedule 05.01.2016