Включить заголовочный файл C++ в Swift

У меня есть заголовочный файл C++ (с именем header.h), который я хочу включить в свой проект Swift.

Поскольку среда C++, которую я хочу включить, еще не закончена, у меня пока есть только заголовочный файл.

Мой заголовочный файл C++ header.h выглядит примерно так:

#include <vector>

struct someStruct{
    float someAttr;
}

class someClass{
    public:
        enum SomeEnum{
            Option1,
            Option2
        }

        void someFunc(const double value) {}
}

Проблема в том, что когда я пытаюсь включить файл header.h в project-Bridging-Header.h, он никогда не найдет вектор, который я включаю в header.h.

файл вектора не найден

Я попытался переименовать header.h в header.hpp. Я попытался установить тип заголовков моста на заголовок С++ на правой панели. Но ни один из них не помог.

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


person ferdyyy    schedule 14.06.2016    source источник
comment
Вы пробовали это?   -  person Dershowitz123    schedule 14.06.2016
comment
Я попытался добавить оболочку, хотя это привело бы к потере классов, которые мне нужно использовать в коде Swift.   -  person ferdyyy    schedule 14.06.2016
comment
Проверьте этот ответ stackoverflow.com/a/24202940/4700426 , надеюсь, это поможет. :)   -  person anuraagdjain    schedule 14.06.2016
comment
Спасибо за подсказку. К сожалению, проблема со всеми этими ответами заключается в том, что они не дадут мне возможности использовать классы, которые я определил в C++. Я смогу только обернуть методы, так что это приведет к статическим функциям, которые не слишком помогают.   -  person ferdyyy    schedule 15.06.2016


Ответы (1)


К сожалению, невозможно напрямую использовать класс C++ в Swift, см. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216-CH2-ID0:

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

На самом деле удобный способ обернуть C++ для использования в Swift — это Objective-C++. Исходные файлы Objective-C++ могут содержать смешанный код Objective-C и C++. Вот краткий частичный пример, основанный на фрагменте кода в вашем вопросе. Только someClass здесь частично обернут. В производственном коде вам также необходимо учитывать управление памятью.

Заголовочный файл обёртки mywrapper.h не имеет следов C++:

#ifndef mywrapper_h
#define mywrapper_h

#import <Foundation/Foundation.h>

// This is a wrapper Objective-C++ class around the C++ class
@interface someClass_oc : NSObject

-(void)someFunc:(double)value;

@end

#endif /* mywrapper_h */

Вот реализация Objective-C++, mywrapper.mm. Обратите внимание на расширение .mm. Вы можете создать файл Objective-C с .m, а затем переименовать его.

    #import "mywrapper.h"
    #import "header.h"  // CAN import a C++ header here, in Objective-C++ code

    // Use an extension on someClass_oc because we need to use someClass,
    // but we couldn't do it in mywrapper.h,
    // which is visible from Swift and thus can't contain C++ stuff.
    @interface someClass_oc ()
    {
        someClass * ptrSomeClass;
    }
    @end

    @implementation someClass_oc

    -(id)init
    {
        // In this example ptrSomeClass is leaked...
        ptrSomeClass = new someClass();
        return self;
    }

    -(void)someFunc:(double)value
    {
        ptrSomeClass->someFunc(value);
    }

    @end

Теперь вы можете импортировать mywrapper.h в заголовок моста, а затем сделать что-то подобное в Swift:

let x = someClass_oc()

x.someFunc(123.456)

Таким образом, вы можете создать объект в Swift, который поддерживается экземпляром вашего класса C++.

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

person Anatoli P    schedule 17.06.2016
comment
спасибо за ваш подробный ответ. Мне, вероятно, нужно полностью обернуть классы и их функции или быстро переписать фреймворк. - person ferdyyy; 21.06.2016