在SWIFT編程中如果想調用C語言編寫的函數則需要通過橋接文件來實現。在橋接文件中通常使用的OC代碼,在OC中就可以直接操作調用C的函數。
1. 在Swift中讀C指針
下面橋接文件中的方法會返回一個int指針,即C術語裏面的(int *):
@interface PointerBridge : NSObject {
int count;
}
- (int *) getCountPtr;
@end
@implementation PointerBridge
- (instancetype) init {
self = [super init];
if(self) {
count = 23;
}
return self;
}
- (int *) getCountPtr {
return &count;
}
@end
在SWIFT中調用橋接文件時可以通過如下方式獲得int*的內容。
let bridge = PointerBridge()
let theInt = bridge.getCountPtr()
print(theInt.memory)
這裏的theInt.memory
得到的值就是23。
2. 在Swift中轉遞C指針給橋接文件
假如oc橋接文件中有如下的一個函數接口
- (void) setCountPtr:(int *)newCountPtr {
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即可。