Swift 如何传递未安全指针<;UInt8>;通过引用到C API?

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, &

我编写了一些Swift 2.2代码来与
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))
}