- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一个需要与 C 库进行互操作的 Swift 程序。此 C 库包含一组使用回调的函数。我解决了如何将 Swift 函数传递给这些 C 函数的问题,但我很难将 Swift 原生类型转换为适当的 C 类型。
具体来说,我有这两个回调(签名必须是这样才能被 C 库接受):
func peer_name_handler_swift_test(p: peer_wr) -> UnsafePointer<CChar>
{
return nil;
}
func peer_ver_handler_swift_test(p: peer_wr) -> UnsafePointer<CUnsignedInt>
{
return nil;
}
好吧,尽管我很努力,但我无法从 String Swift 类型和简单的 CUnsignedInt 数组返回正确的类型。
我想在这些回调中返回的 2 个数据是:
var BLZ_SWIFT_TEST_PEER_VER: [CUnsignedInt] = [0,0,1,0];
var BLZ_SWIFT_TEST_PEER_NAME: String = "test_swift_peer";
你能帮帮我吗?
最佳答案
可以通过多种方式将数据强制转换为正确的指针类型。这个问题的棘手部分是决定如何管理您给出指针的内存。
如果您在编译时声明静态已知的值,您可以这样做:
// I _think_ you need to manually null-terminate the string here
let BLZ_SWIFT_TEST_PEER_NAME: StaticString = "test_swift_peer\0"
func peer_name_handler_swift_test(p: peer_wr) -> UnsafePointer<CChar>
{
return UnsafePointer(BLZ_SWIFT_TEST_PEER_NAME.utf8Start)
}
// tuples are the closest approximation to C fixed-size arrays
var BLZ_SWIFT_TEST_PEER_VER
= (0,0,1,0) as (CUnsignedInt,CUnsignedInt,CUnsignedInt,CUnsignedInt)
func peer_ver_handler_swift_test(p: peer_wr) -> UnsafePointer<CUnsignedInt>
{
return withUnsafePointer(&BLZ_SWIFT_TEST_PEER_VER) {
UnsafePointer($0)
}
}
两个函数体中多出的UnsafePointer
都是指针转换。在字符串的情况下,因为 utf8
是 UInt8
而 CChar
是 Int8
的别名。在数组的情况下,因为您需要指向第一个 CUnsignedInt
的指针而不是指向 4 元组的指针。
如果你想在运行时改变值,你需要决定谁来创建/释放内存,你是否需要分配多位内存,因为回调的调用者将存储指针,然后如果你改变它,你将需要分配一个新的内存位而不是覆盖你已经分发的内存等等,如果是这样,你如何跟踪它以便稍后释放它以避免泄漏。如果你想要一个单一的静态字符串,但你想在运行时创建一个,比如从配置文件中创建,你可以这样做:
// prior to the callback getting called
let namePtr = strdup(BLZ_SWIFT_TEST_PEER_NAME)
func peer_name_handler_swift_test(p: peer_wr) -> UnsafePointer<CChar>
{
return UnsafePointer(namePtr)
}
// then some time later, if you want to clean up
free(namePtr)
关于c - 如何使用 Swift 返回 UnsafePointer <CChar> 和 UnsafePointer <CUnsignedInt>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904321/
如何在 Swift 中获取 char/CChar?我需要调用以下方法: - (void)registerOption:(NSString *)longOption shortcut:(char)sho
一些 C API,例如glGetShaderInfoLog,返回缓冲区中的字符数组。我需要将它们转换为字符串才能使用。 var value: GLint = 0 glGetShaderiv(shade
FILE_BOTH_DIR_INFORMATION 的 ShortNameLength 成员结构声明如下: typedef struct FILE_BOTH_DIR_INFORMATION { .
在我的 swift 应用程序项目中,我必须与 C API 交互。其中一个 C 函数将 char 指针作为输入,因此我必须将我的 swift 字符串转换为 char 指针。但我不知道如何正确地做到这一点
我有一个 objective-c 函数,它给了我一个 UnsafePointer/UnsafePointer. 但是我需要这些数据作为 UnsafePointer 不幸的是我需要的功能没有实现 Uns
我尝试在 Objective-C 上编写 this tutorial 上编写的 Swift 代码. 除了这部分之外,我几乎把所有内容都写成了 Objective-C: let tokenChars =
如何在 Swift 中使用字符串文字初始化 CChar 或 UInt8? extension UInt8 : ExtendedGraphemeClusterLiteralConvertible {
我已经为一些旧的 C 源代码导入并创建了一个桥接头文件到 Swift。函数签名如下所示: struct Message prattle_parse_message(char *line); 它的快速声
我正在将 Swift 2.x 项目迁移到 Swift 3。 我在转换 UnsafeMutableBufferPointer 时遇到问题至 UnsafeMutablePointer在 Swift 3 语
我在将GBK编码下的CChar更改为Data时遇到了问题。有人能给我一些提示吗,这会有很大帮助语法似乎改变了,所以我对如何去做有点难过 之前改成了NSData,但是语法改成Data了,不知道怎么交换。
我正在编写一个需要与 C 库进行互操作的 Swift 程序。此 C 库包含一组使用回调的函数。我解决了如何将 Swift 函数传递给这些 C 函数的问题,但我很难将 Swift 原生类型转换为适当的
我在迁移到 Swift 时将一个 Objective-C 片段转换为 Swift。我对 Objective-C 还是个新手,我对 Swift 的了解一般。在尝试从 Int8 转换为 C Char 时满
在 Swift 中使用标准 C 库函数时,我遇到了问题传递 C 字符串时。作为一个简单的例子(只是为了演示问题),标准 C 库函数 char * strdup(const char *s1); 作为
我将 xCode 和/或 swift 1.0 更新为 1.2,但出现了很多错误, 我知道 Swift 1.2 中的一些方法已更新/更改,因此我开始将我的整个项目更新到 Swift 1.2。我被困在这条
我是一名优秀的程序员,十分优秀!