gpt4 book ai didi

ios - 如何从纯 C 函数获取返回值到 swift?

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:09 26 4
gpt4 key购买 nike

我有疑问,如何从纯 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 函数返回一个字符串,那么返回类型应该是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>

你可以用返回的指针创建一个 Swift 字符串

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" 是一个字符串文字。通常你不能返回一个指向局部变量的指针一个函数,因为指针指向的内存可能不是从函数返回后有效。如果指针没有指向到静态内存然后你必须复制它。示例:

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)

关于ios - 如何从纯 C 函数获取返回值到 swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28090910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com