我寫了一些雨燕2.2的代碼與OpenSSL
çAPI的互動,現在我想將其轉換爲斯威夫特3.如何通過引用將UnsafePointer <UInt8>傳遞給C API?
在斯威夫特2
let octets = pkcs7_d_data(pkcs7_d_sign(receiptPKCS7).memory.contents)
var ptr = UnsafePointer<UInt8>(octets.memory.data)
// now pass pointer by reference
ASN1_get_object(&ptr, &length, &type, &xclass, end - ptr)
在斯威夫特3,我不得不做一些修改
// use guard so i dont have to constantly unwrap these values
guard let octets = pkcs7_d_data(pkcs7_d_sign(receiptPKCS7).pointee.contents),
var ptr = UnsafePointer<UInt8>(octets.pointee.data) else {
return nil
}
ASN1_get_object(&ptr, &length, &type, &xclass, end - ptr)
// ^^^ this is now a compiler error
不幸的是,我可以參考不再傳遞ptr
到ASN1_get_object
,由於這個錯誤:
Cannot pass immutable value as inout argument: Implicit conversion from UnsafePointer<UInt8> to UnsafePointer<UInt8>? requires a temporary
然後其餘的錯誤被切斷(沒有展開箭頭)。
我已經試過什麼:
- 改變
ptr
分配UnsafePointer<UInt8>(octets.pointee.data)?
但後來有人告訴我,我現有的分配已經產生可選 - 改變了
UnsafePointer
到UnsafeMutablePointer
這裏需要改變什麼?
我還沒有使用Swift 3,但我前兩天在2.3中處理過類似的問題。直接執行'ASN1_get_object(&octet.pointee.data ...)'沒有做你需要的嗎? –
首先,它仍然拋出一個關於不傳入不可變的錯誤,其次我想在移動'ptr'時保留一個單獨的引用。 – ray