2016-11-30 70 views
1

考慮在C以下代碼:Swift3:(!指針本身是int值,不指向任何地方)原始指針轉換成int

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

我知道這個代碼看起來有點奇怪,但是這個功能是一個回調函數,回調函數必須採用void *參數,因爲實際上someData實際上是指向某些內存結構的指針(type會告訴我哪個結構),但在這種情況下不是。在這種情況下,它實際上只是一個無符號的int值;不是指向這樣一個值的指針,而是值本身。來電者真正調用這個函數是這樣的:

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

是啊,這是愚蠢和醜陋,但我沒有寫的代碼,我也無法改變它。我只需要實施回調。我真的很喜歡在Swift(Swift 3)中這麼做。但是在斯威夫特,回調有看起來像這樣:

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

而我的函數被調用就好了......但我怎麼得到的數字的指針值,因爲我需要的無符號整型值,並把它傳遞給另一個功能。

+0

可能重複的:http://stackoverflow.com/questions/40569800/how-to-get-value-of- unsafemutablerawpointer – Fefux

+0

@Fefux如果這真的是另一個問題的重複,那麼在那裏的答案是相當差的,考慮到超級優雅的解決方案MartinR提供;) – Mecki

+0

是的,我發佈這個可能的副本,但我讀的答案,他們不是非常有幫助。 – Fefux

回答

1

您可以使用Int(bitPattern:)得到的指針值作爲 整數

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

太棒了!這真的有用! :)你甚至不需要'如果讓'作爲'bitPattern:'實際上需要'UnsafeMutableRawPointer?' – Mecki

+0

@Mecki:你是對的 - 修正的。 –