如何从纯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)