Swift与C语言交叉编译

Home / iOS MrLee 2016-2-16 2714

本来在写这篇文章之前是准备写一篇socket的文章,但是发现swift悲剧的没有封装好的库可以用,如果要用socket必须依赖C/C++的库(或者自己用C实现),作为新手的我,这点必须要学习,所以也有了这篇。我用的是XCODE7.1,网上的很多资料都不适合,编译不过。很多都提示未定义,可能是因为是swift1.0的原因。
在Swift中,指针都使用一个特殊的类型来表示,那就是UnsafePointer。遵循了Cocoa的一贯不可变原则,UnsafePointer 也是不可变的。当然对应地,它还有一个可变变体,UnsafeMutablePointer。绝大部分时间里,C中的指针都会被以这两种类型引入到Swift中:C中const修饰的指针对应UnsafePointer(最常见的应该就是C字符串的const char *了),而其他可变的指针则对应UnsafeMutablePointer。除此之外,Swift中存在表示一组连续数据指针的UnsafeBufferPointer,表示非完整结构的不透明指针COpaquePointer等等。另外你可能已经注意到了,能够确定指向内容的指针类型都是泛型的struct,我们可以通过这个泛型来对指针指向的类型进行约束以提供一定安全性。
下面简单举例说明,首先是C代码
int test() {
    printf("Hello,C\n");
    return 1;
}
int testSum(int a,int b) {
    return a + b;
}
void testPrintString(const char* str) {
    printf("%s",str);
}

然后是在Swift中调用的方法
@asmname("test") func c_test() -> CInt // 声明,不需要 {} 函数体
@asmname("testSum") func c_testSum(a:CInt,b:CInt) -> CInt
@asmname("testPrintString") func c_testPrintString(string:UnsafePointer)
c_test()
var sum = c_testSum(10, b: 20)
print(sum)
print("Hello, World!")
c_testPrintString("Swift\n")

运行结果:

E81793B7-CC55-43DC-B5D1-CB391589560D


 

本文链接:https://www.it72.com/7839.htm

推荐阅读
最新回复 (0)
返回