我写了一些雨燕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