在SWIFT编程中如果想调用C语言编写的函数则需要通过桥接文件来实现。在桥接文件中通常使用的OC代码,在OC中就可以直接操作调用C的函数。
1. 在Swift中读C指针
下面桥接文件中的方法会返回一个int指针,即C术语里面的(int *):
@H_301_9@@interface PointerBridge : NSObject {
@H_301_9@int count;
}
- (@H_301_9@int *) getCountPtr;
@H_301_9@@end
@H_301_9@@implementation PointerBridge
- (instancetype) init {
@H_301_9@self = [@H_301_9@super init];
@H_301_9@if(@H_301_9@self) {
count = 23;
}
@H_301_9@return @H_301_9@self;
}
- (@H_301_9@int *) getCountPtr {
@H_301_9@return &count;
}
@H_301_9@@end
在SWIFT中调用桥接文件时可以通过如下方式获得int*的内容。
@H_301_9@let bridge = PointerBridge()
@H_301_9@let theInt = bridge.getCountPtr()
print(theInt.memory)
这里的theInt.memory
得到的值就是23。
2. 在Swift中转递C指针给桥接文件
- (@H_301_9@void) setCountPtr:(@H_301_9@int *)newCountPtr { @H_301_9@count = *newCountPtr; }
此时在SWIFT代码中传给setCountPtr
函数的参数需为int *类型。在SWIFT中可以通过UnsafeMutablePointer<Int32>
类型来操作。
let bridge = PointerBridge()
let theInt = bridge.getCountPtr() print(theInt.memory)
let newIntPtr = UnsafeMutablePointer<Int32>.alloc(1)
newIntPtr.memory = 100 bridge.setCountPtr(newIntPtr)
print(theInt.memory) // 100
通过这种方式,bridge中的count就被修改为了100。需要注意的是给UnsafeMutablePointer<Int32>
构造方法传入的参数是需要分配空间的对象的个数,在这里只需要一个Int32对象,所以我们传入1即可。