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)")