我正在将我的一个iOS应用程序移植到Swift3 / Xcode8。我已经嵌入了一个C库,它需要一个类型为:
char ***在Swift2.3中,这被翻译成:
UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>所以我可以像这样在我的快速代码中声明指针:
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中的变化吗?这是什么可选的,可选的,隐式展开可选的(?)在这个上下文中的意思,以及我如何用这个类型声明一个指针?
发布于 2016-09-27 11:06:43
试一试
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但是,如果C代码中的setPtr(char *** ptr) (其中_Nonnull是不可用的)执行类似于
*ptr = NULL;?那么Swift代码将在运行时崩溃。但是,使用optionals时,您不需要在setPtr()的声明中使用_Nonnull注释,您的Swift代码将变为
let myPointer = UnsafeMutablePointer<
UnsafeMutablePointer<
UnsafeMutablePointer<Int8>?>?>.allocate(capacity: 1)
setPtr(myPointer)
let myInt = myPointer.pointee?.pointee?.pointee而且它不会在运行时崩溃。因此,当您不使用_Nonnull时,由Swift3强制执行的带有可选参数的方法更安全。
https://stackoverflow.com/questions/39699900
复制相似问题