Swift 如何传递未安全指针<;UInt8>;通过引用到C API?
我编写了一些Swift 2.2代码来与Swift 如何传递未安全指针<;UInt8>;通过引用到C API?,swift,openssl,pass-by-reference,swift3,unsafe-pointers,Swift,Openssl,Pass By Reference,Swift3,Unsafe Pointers,我编写了一些Swift 2.2代码来与OpenSSLCAPI交互,现在我正试图将其转换为Swift 3 斯威夫特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, &
OpenSSL
CAPI交互,现在我正试图将其转换为Swift 3
斯威夫特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)
然后错误的其余部分被切断(没有展开箭头)
我所尝试的:
- 将
赋值更改为ptr
但我被告知,我现有的赋值已经产生了一个可选的UnsafePointer(octets.pointee.data)?
- 将
更改为UnsafePointer
unsafemeutablepointer
这里需要更改什么?问题似乎是
八位字节.pointee.data
是一个
unsafemeutablepointer
,但ASN1\u get\u对象
非安全指针的地址?
以下代码已编译,但我无法对其进行测试:
if
let octets = pkcs7_d_data(pkcs7_d_sign(receiptPKCS7).pointee.contents),
let data = octets.pointee.data {
var ptr: UnsafePointer? = UnsafePointer(data) // (*)
var length = 0
var tag: Int32 = 0
var xclass: Int32 = 0
ASN1_get_object(&ptr, &length, &tag, &xclass, Int(octets.pointee.length))
}
(*)
是指针转换,使其能够编译。我还没有使用Swift 3,但前几天我在2.3中处理过类似的问题。直接执行ASN1\u get\u对象(&octet.pointee.data…)
是否不能满足您的需要?首先,它仍然会抛出一个错误,关于不将不可变的作为inout传递,其次,我希望在移动ptr
时保留一个单独的引用。这似乎可行,但我没有指定UInt8
?另外,当ptr处于guard
状态时,我不能像这样分配ptr
,所以现在似乎每次使用它时都必须将其打开。@ray:ptr
的类型为UnsafePointer?
,您可以通过选项在Xcode中单击变量来验证。UInt8
是自动推断的,您可以更详细地编写var ptr:UnsafePointer?=未安全指针(数据)
——你不能在guard语句之后定义ptr
吗?我可以,我只是对这样一个事实感到难过,我似乎无法分配指针,并且指定它是可选的,如果它是条件语句的一部分。一旦我在guard
之外定义了它,我每次使用它时都必须打开ptr
。
Cannot pass immutable value as inout argument: Implicit conversion from UnsafePointer<UInt8> to UnsafePointer<UInt8>? requires a temporary
if
let octets = pkcs7_d_data(pkcs7_d_sign(receiptPKCS7).pointee.contents),
let data = octets.pointee.data {
var ptr: UnsafePointer? = UnsafePointer(data) // (*)
var length = 0
var tag: Int32 = 0
var xclass: Int32 = 0
ASN1_get_object(&ptr, &length, &tag, &xclass, Int(octets.pointee.length))
}