如何使用std:vector使Objective-c类可用于Swift类

时间:2016-04-29 23:30:34

标签: c++ objective-c swift std

如果我尝试在我的项目的Swift桥接头中包含一个使用std:vector的Objective-C类,在我的课程中我会收到错误:

#import <vector>                 Error! 'vector' file not found

有问题的桥接文件位于我的自定义框架中。如果我没有在我的桥接头中包含objective-c标头,那么所有编译和工作都很好,但当然我无法从Swift类访问该类。

如何在Swift类中使用此objective-c类?

1 个答案:

答案 0 :(得分:4)

Swift只支持桥接到Objective-C。您需要将任何CPP代码/声明移动到.mm文件,例如:

foo.h中

#import <Foundation/Foundation.h>

@interface Foo : NSObject

- (void)bar;

@end

<强> Foo.mm

#import "Foo.h"
#import <vector>

@interface Foo() {
    std::vector<int> _array;
}

@end

@implementation Foo

- (void)bar {
    NSLog(@"in bar");
}

@end

一个解决方案,如果你必须使用其他C ++ / Objective-C ++代码中的C ++类,为Swift的桥接头创建一个单独的头文件,并公开你需要的东西:

<强> foo.h中

#import <Foundation/Foundation.h>
#import <vector>

@interface Foo : NSObject {
    std::vector<int>* _bar;
}

@property (atomic, readonly) std::vector<int>* bar;
@property (readonly) size_t size;

- (void)pushInt:(int)val;
- (int)popInt;

@end

<强>富+ Swift.h

在您的桥接标题中包含此内容

#import <Foundation/Foundation.h>
#import <stdint.h>

@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<int>();
    }

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