3

我编写了一些 Swift 2.2 代码来与OpenSSLC API 交互,现在我正试图将其转换为 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)

在 Swift 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)?但随后我被告知我现有的分配已经产生了一个可选的
  • 更改UnsafePointerUnsafeMutablePointer

这里需要改变什么?

4

1 回答 1

3

问题似乎octets.pointee.data是 a UnsafeMutablePointer<UInt8>!,但ASN1_get_object需要 a 的地址UnsafePointer<UInt8>?

以下代码可以编译,但我无法对其进行测试:

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))
}

(*)是使它编译的指针转换。

于 2016-10-06T18:41:01.290 回答