2016-11-12 77 views
0

我在.h文件中有一個unsigned char數組。並且,我還有一個函數將unsigned char數組作爲輸入。當我嘗試快速調用此函數時,它會得到UnsafeMutablePointer<UInt8>。所以,自動對象C到SWIFT轉換器認爲unsigned char應該被轉換爲UnsafeMutablePointer<UInt8>。但是,我無法直接將我的變量傳遞給此函數。因爲我得到了,將unsinged char數組從目標c轉換爲UnsafeMutablePointer <UInt8> swift

Cannot convert value of type '(UInt8, UInt8, UInt8, UInt8, UInt8)' to expected argument type 'UnsafeMutablePointer<UInt8>!' 

這個數組的長度是靜態的。所以,我可以通過KEY.0KEY.1創建

let key = UnsafeMutablePointer<UInt8>.allocate(capacity: 64); 

和,還我可以得到價值...等,所以,我需要的是創造一個for循環從KEY讀取值並將其分配給key

for index in 1...64 { 
    key[index] = KEY[index]; 
} 

但是,這給了編譯錯誤爲:

Value of tuple type '(UInt8, UInt8, UInt8, UInt8, UInt8)' has no member 'index' 

所以,第一個問題,我如何從得到任何價值按索引。二是,有沒有一個unsigned char數組轉換爲UnsafeMutablePointer<UInt8>

回答

1

AC陣列

unsigned char ckey[64]; 

導入爲斯威夫特元組的任何更簡單的方法:

public var ckey: (UInt8, ..., UInt8) 

,沒有人可以訪問的元組元素通過爲索引添加下標。 (嗯,你可以當使用Mirror)。

然而:

  • C數組的地址是相同的,第一 陣列元素的地址,和
  • 爲選自C進口結構夫特保留存儲器的佈局。

後者是confirmed by Apple engineer Joe Groff:

...你可以留在C中定義的結構,並將其導入斯威夫特。 Swift會尊重C的佈局。

因此可以在第一元組元素的地址傳遞給 功能:

f(key: &ckey.0) 

當然 - 在C - 有關陣列的大小的信息被 丟失,所以陣列應該是NUL終止的,或者f應該知道 關於數組大小。或者,將尺寸 作爲功能的附加參數:

foo(key: &ckey.0, length: MemoryLayout.size(ofValue: ckey)) 
相關問題