gpt4 book ai didi

c - 如何使用 Swift 返回 UnsafePointer 和 UnsafePointer

转载 作者:可可西里 更新时间:2023-11-01 02:22:50 26 4
gpt4 key购买 nike

我正在编写一个需要与 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都是指针转换。在字符串的情况下,因为 utf8UInt8CCharInt8 的别名。在数组的情况下,因为您需要指向第一个 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/

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