【问题标题】:Swift3 changes to UnsafeMutablePointerSwift3 更改为 UnsafeMutablePointer
【发布时间】:2016-09-26 10:03:40
【问题描述】:

我正在将我的一个 iOS 应用程序移植到 Swift3 / Xcode8。 我嵌入了一个 C 库,它需要一个函数参数类型:

char ***

在 Swift2.3 中,这被翻译成:

UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>

所以我可以像这样在我的 swift 代码中声明该指针:

let myPointer = UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>.alloc(1)

在我使用 Swift3 更新到 Xcode8 之前效果很好,现在我收到编译器错误:

Cannot convert value of type 'UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>' to expected argument type 'UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?>!'

谁能帮我理解 swift3 的变化?这个 Optional, Optional, Implicit Unwrapped Optional (?) 在这种情况下是什么意思,我如何声明这个类型的指针?

【问题讨论】:

  • 但是我没有收到任何错误let _ = UnsafeMutablePointer&lt;UnsafeMutablePointer&lt;UnsafeMutablePointer&lt;Int8&gt;&gt;&gt;.allocate(capacity: 1)
  • @AlvinVarghese 当我将它作为参数传递给需要 char *** 类型的 C 函数时,我收到错误消息

标签: swift3 xcode8 unsafemutablepointer


【解决方案1】:

试试

let myPointer = UnsafeMutablePointer<
    UnsafeMutablePointer<
    UnsafeMutablePointer<Int8>?>?>.allocate(capacity: 1)

或者,您也可以使用_Nonnull 注释将指针保持为非可选。假设 C 函数是void setPtr(char ***)。你可以通过如下的桥接头来编写它对 Swift 可用的声明:

void setPtr(char * _Nonnull * _Nonnull * _Nonnull);

然后在您的 Swift 代码中,您可以执行以下操作:

let myPointer = UnsafeMutablePointer<
        UnsafeMutablePointer<
        UnsafeMutablePointer<Int8>>>.allocate(capacity: 1)
setPtr(myPointer)
let myInt = myPointer.pointee.pointee.pointee

但是如果 setPtr(char *** ptr) 在 C 代码中,_Nonnull 不可用,会做类似的事情

*ptr = NULL;

?然后 Swift 代码将在运行时崩溃。但是,使用可选项,您不需要在 setPtr() 的声明中添加 _Nonnull 注释,您的 Swift 代码就变成了

let myPointer = UnsafeMutablePointer<
        UnsafeMutablePointer<
        UnsafeMutablePointer<Int8>?>?>.allocate(capacity: 1)
setPtr(myPointer)
let myInt = myPointer.pointee?.pointee?.pointee

它不会在运行时崩溃。 因此,当您不使用 _Nonnull 时,由 Swift3 强制执行的带有可选项的方法更安全。

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多