Swift3: 将裸指针转换为Int(指针本身是int值,不指向任何地方!)

4

Consider the following code in C:

void someFunction ( int type, void * someData ) {
    unsigned value = (int)someData;
}

我知道这段代码看起来有些奇怪,但这个函数是一个回调函数,回调函数必须带有void *参数,因为很多时候someData实际上是指向某个内存结构体的指针(type会告诉我它是哪个结构体),但在这种情况下不是。在这种情况下,它只是一个无符号整数值;不是指向该值的指针,而是该值本身。调用者真正调用这个函数的方式如下:

unsigned value = ...;
callbackFunction(type, (void *)value);

是的,那很愚蠢且难看,但我并没有编写代码,也不能进行更改。我只需要实现回调函数。而我真的很想在Swift(Swift 3)中实现它。但是在Swift中,回调函数必须长这个样子:

func someFunction ( _ type: Int, _ someData: UnsafeMutableRawPointer? ) -> Void

我的函数调用很好,但是我该如何获取数字指针值呢?因为我需要无符号整型值并将其传递给另一个函数。


可能是重复的问题:https://dev59.com/i5zha4cB1Zd3GeqPFHHP - Fefux
@Fefux 如果那真的是另一个问题的副本,那么考虑到MartinR提供的超级优雅的解决方案,那里的答案相当差劲;) - Mecki
是的,我发布了这个可能是重复的问题,但我已经阅读了答案,它们并没有真正有帮助。 - Fefux
1个回答

5

您可以使用Int(bitPattern:)将指针值转换为整数:

func someFunction ( _ type: Int, _ someData: UnsafeMutableRawPointer? ) -> Void {
    let value = Int(bitPattern: someData)
    print(value)
}

太棒了!真的有效! :) 实际上,您甚至不需要使用 if let,因为 bitPattern: 实际上接受 UnsafeMutableRawPointer? - Mecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接