ios*_*ner 0 c function ios swift
我有一个疑问,如何将纯c函数的返回值快速获取。
这是我的代码:
在 ViewController.swift// swift 文件中
var name = getPersonName()
Run Code Online (Sandbox Code Playgroud)
在personList.h// C 头文件中
char getPersonName();
Run Code Online (Sandbox Code Playgroud)
在personList.c// 纯 C 文件中
#include personList.h
char getPersonName() {
char* name = "Hello, Swift";
return name;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我已经使用MyProjectName-Bridging-Header.h.
谢谢
如果您希望 C 函数返回一个字符串,则返回类型应该是
char *或更好const char *:
// personList.h:
const char *getPersonName(void);
// personList.c:
const char *getPersonName(void)
{
char *name = "Hello, Swift";
return name;
}
Run Code Online (Sandbox Code Playgroud)
这被导入到 Swift 中
func getPersonName() -> UnsafePointer<Int8>
Run Code Online (Sandbox Code Playgroud)
你可以从返回的指针创建一个 Swift 字符串
let name = String.fromCString(getPersonName())!
println(name) // Output: Hello, Swift
// Swift 3:
let name = String(cString: getPersonName())
print(name) // Output: Hello, Swift
Run Code Online (Sandbox Code Playgroud)
“万岁,”你会说,“这就是我需要的。” ——等等!!
这只是因为"Hello, Swift"在 C 函数中是一个字符串文字。通常,您不能从函数返回指向局部变量的指针,因为该指针指向的内存在从函数返回后可能无效。如果指针不指向静态内存,则必须复制它。例子:
const char *getPersonName(void)
{
char name[200];
snprintf(name, sizeof name, "%s %s", "Hello", "Swift!");
return strdup(name);
}
Run Code Online (Sandbox Code Playgroud)
但现在调用者最终必须释放内存:
let cstr = getPersonName()
let name = String.fromCString(cstr)!
free(UnsafeMutablePointer(cstr))
println(name)
Run Code Online (Sandbox Code Playgroud)
或者,您可以更改 C 函数,以便调用者传递内存:
void getPersonName(char *name, size_t nameSize)
{
snprintf(name, nameSize, "%s %s", "Hello", "Swift!");
}
Run Code Online (Sandbox Code Playgroud)
这将在 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |