如何从纯 C 函数获取 return 值到 swift?
How to get return values from pure C function to 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 函数 return 一个字符串那么 return 类型应该是
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>
并且您可以使用
从 returned 指针创建一个 Swift 字符串
let name = String.fromCString(getPersonName())!
println(name) // Output: Hello, Swift
// Swift 3:
let name = String(cString: getPersonName())
print(name) // Output: Hello, Swift
"Hooray," 你会说,"that's what I need." – 但是等等!!
这仅是因为 C 函数中的 "Hello, Swift"
是 字符串文字 。通常你不能 return 指向局部变量的指针
一个函数,因为指针指向的内存可能不是
在函数 return 之后有效。如果指针没有指向
到静态内存然后你必须复制它。示例:
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)
我有疑问,如何从纯 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
.
谢谢
如果你想让 C 函数 return 一个字符串那么 return 类型应该是
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>
并且您可以使用
从 returned 指针创建一个 Swift 字符串let name = String.fromCString(getPersonName())!
println(name) // Output: Hello, Swift
// Swift 3:
let name = String(cString: getPersonName())
print(name) // Output: Hello, Swift
"Hooray," 你会说,"that's what I need." – 但是等等!!
这仅是因为 C 函数中的 "Hello, Swift"
是 字符串文字 。通常你不能 return 指向局部变量的指针
一个函数,因为指针指向的内存可能不是
在函数 return 之后有效。如果指针没有指向
到静态内存然后你必须复制它。示例:
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)