如何从纯C函数返回值到swift?

我有一个疑问,如何从纯c函数获取返回值swift。

在这里我的代码:

ViewController.swift // swift文件

 var name = getPersonName() 

personList.h // C头文件

 char getPersonName(); 

personList.c //纯C文件

 #include personList.h char getPersonName() { char* name = "Hello, Swift"; return name; } 

在这里,我已经使用MyProjectName-Bridging-Header.h通过网桥链接personList.h文件。

谢谢

如果你想C函数返回一个string,那么返回types应该是char *或更好的const char *

 // personList.h: const char *getPersonName(void); // personList.c: const char *getPersonName(void) { char *name = "Hello, Swift"; return name; } 

这被导入到Swift中

 func getPersonName() -> UnsafePointer<Int8> 

你可以用返回的指针创build一个Swiftstring

 let name = String.fromCString(getPersonName())! println(name) // Output: Hello, Swift // Swift 3: let name = String(cString: getPersonName()) print(name) // Output: Hello, Swift 

“万岁”,你会说,“这就是我所需要的。” – 但是等等! 这只是因为C函数中的"Hello, Swift"是一个string文字 。 通常你不能从一个函数返回一个指向本地variables的指针,因为指针指向的内存从函数返回后可能不是有效的。 如果指针不指向静态内存,那么你必须复制它。 例:

 const char *getPersonName(void) { char name[200]; snprintf(name, sizeof name, "%s %s", "Hello", "Swift!"); return strdup(name); } 

但是现在调用者最终必须释放内存:

 let cstr = getPersonName() let name = String.fromCString(cstr)! free(UnsafeMutablePointer(cstr)) println(name) 

或者,您可以更改C函数,以便调用者传递内存:

 void getPersonName(char *name, size_t nameSize) { snprintf(name, nameSize, "%s %s", "Hello", "Swift!"); } 

这将从Swift中使用

 var nameBuf = [Int8](count: 200, repeatedValue: 0) // Buffer for C string getPersonName(&nameBuf, UInt(nameBuf.count)) let name = String.fromCString(nameBuf)! println(name) // Swift 3: var nameBuf = [Int8](repeating: 0, count: 200) // Buffer for C string getPersonName(&nameBuf, nameBuf.count) let name = String(cString: nameBuf) print(name)