2016-06-14 3 views
0

У меня есть заголовочный файл C++ (с именем header.h), который я хочу включить в мой проект Swift.Включить заголовочный файл C++ в 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

'vector' file not found

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

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

+0

Вы пробовали [это] (http://www.swiftprogrammer.info/swift_call_cpp.html)? – Dershowitz123

+0

Я попытался добавить обертку, хотя это приведет к потере классов, которые мне нужно использовать в Swift Code – ferdyyy

+0

Проверьте этот ответ http://stackoverflow.com/a/24202940/4700426, надеюсь, что это поможет. :) –

ответ

2

К сожалению, это не представляется возможным использовать класс 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++ класс.

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

+0

спасибо за подробный ответ. Мне, вероятно, нужно полностью обернуть классы и его функции или переписать структуру в swift. – ferdyyy

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