2016-05-15 121 views
5

我正在使用Swift中的外部C庫for OS X.我得到一個值cda,它在C中定義爲double*(它是一個雙數組的指針)。無法將類型'UnsafePointer <Double>'的值轉換爲期望的參數類型'UnsafePointer <_>'

當導入到Swift中時,它將類型識別爲UnsafeMutablePointer。我試圖將此指針和計數轉換爲雙數組。下面是我使用的代碼(假設arrlen是數組的正確的計數):

let doublearrptr = UnsafePointer<Double>(cda) 
let xptarr = UnsafeBufferPointer<Double>(start: doublearrptr, count:arrlen) 

然而,編譯這段代碼的時候,我得到的錯誤:

Cannot convert value of type 'UnsafePointer<Double>' to expected argument type 'UnsafePointer<_>' 

我Swift相對較新,但我相當肯定我無法轉換爲UnsafePointer<_>。我試圖轉換爲UnsafePointer<Void>,但得到了相同的錯誤。 Swift確認cdaUnsafeMutablePointer<Double>

+0

當你說「它認爲類型爲UnsafeMutablePointer」,你的意思是它認爲它是一個'UnsafeMutablePointer '? – paulvs

+0

是的,對不起。它承認雙倍。 – Laxsnor

+0

你能隔離和發佈不依賴於庫的代碼嗎? (例如聲明一個C double數組,並試圖將其轉換爲Swift'Array ')並顯示哪一行產生錯誤?你發佈的代碼似乎沒問題。 – paulvs

回答

3

所以,我能夠解決它,儘管以迂迴的方式。

我創建了一個新的功能轉換,並用它:

func convertArr<T>(count: Int, data: UnsafePointer<T>) -> [T] { 

    let buffer = UnsafeBufferPointer(start: data, count: count) 
    return Array(buffer) 
} 
... 
let doublearrptr = UnsafePointer<Double>(cda) 
let arr = convertArr(Int(shobjarrlen), data: doublearrptr) 

出於某種原因,這個工作,但不是原來的語法...

我仍然開放給獲得答案從爲什麼我的原始語法不起作用。

+0

哇,很好找。完全同意你的原代碼應該沒問題。我遇到了同樣的問題 - 對我來說,這看起來很像Swift中的一個bug。 – HughHughTeotl

相關問題