Comment créer une classe Objective-c avec std: vecteur mis à la disposition des classes Swift

Si j’essaie d’inclure une classe objective-C utilisant std: vector dans l’en-tête de pontage Swift de mon projet, l’erreur suivante apparaît dans ma classe:

#import  Error! 'vector' file not found 

Le fichier de pontage en question se trouve dans mon Framework personnalisé. Si je n’inclue pas l’en-tête objective-c dans mon en-tête de pontage, tout se comstack et fonctionne correctement, mais je ne peux bien sûr pas accéder à la classe à partir de classes Swift.

Comment puis-je utiliser cette classe objective-c dans mes classes Swift?

Swift ne prend en charge que la transition vers Objective-C . Vous devez déplacer tout code / déclaration CPP dans le fichier .mm, tel que:

Foo.h

 #import  @interface Foo : NSObject - (void)bar; @end 

Foo.mm

 #import "Foo.h" #import  @interface Foo() { std::vector _array; } @end @implementation Foo - (void)bar { NSLog(@"in bar"); } @end 

Une solution, si vous devez utiliser les classes C ++ dans un autre code C ++ / Objective-C ++, consiste à créer un fichier d’en-tête séparé pour l’en-tête de pontage de Swift et à exposer ce dont vous avez besoin:

Foo.h

 #import  #import  @interface Foo : NSObject { std::vector* _bar; } @property (atomic, readonly) std::vector* bar; @property (readonly) size_t size; - (void)pushInt:(int)val; - (int)popInt; @end 

Foo + Swift.h

Incluez ceci dans votre en-tête de pontage

 #import  #import  @interface Foo : NSObject @property (readonly) size_t size; - (void)pushInt:(int)val; - (int)popInt; @end 

Foo.mm

 #import "Foo.h" @implementation Foo @synthesize bar; - (instancetype)init { if (self = [super init]) { _bar = new std::vector(); } return self; } - (void)dealloc { delete _bar; } - (void)pushInt:(int)val { _bar->push_back(val); } - (int)popInt { if (_bar->size() == 0) { return -1; } auto front = _bar->back(); _bar->pop_back(); return front; } - (size_t)size { return _bar->size(); } @end 

main.swift

 #import Foundation let f = Foo() f.pushInt(5); f.pushInt(10); print("size = \(f.size)") print("\(f.popInt())") print("\(f.popInt())") print("size = \(f.size)")