首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对UnsafeMutablePointer的Swift3更改

对UnsafeMutablePointer的Swift3更改
EN

Stack Overflow用户
提问于 2016-09-26 18:03:41
回答 1查看 588关注 0票数 0

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

代码语言:javascript
复制
char ***

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

代码语言:javascript
复制
UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>

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

代码语言:javascript
复制
let myPointer = UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>.alloc(1)

在我用Swift3更新到Xcode8之前,这个方法运行得很好,现在我得到了一个编译器错误:

代码语言:javascript
复制
Cannot convert value of type 'UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>' to expected argument type 'UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?>!'

我可以帮助我理解swift3中的变化吗?这是什么可选的,可选的,隐式展开可选的(?)在这个上下文中的意思,以及我如何用这个类型声明一个指针?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-27 11:06:43

试一试

代码语言:javascript
复制
let myPointer = UnsafeMutablePointer<
    UnsafeMutablePointer<
    UnsafeMutablePointer<Int8>?>?>.allocate(capacity: 1)

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

代码语言:javascript
复制
void setPtr(char * _Nonnull * _Nonnull * _Nonnull);

然后在你的Swift代码中,你可以这样做:

代码语言:javascript
复制
let myPointer = UnsafeMutablePointer<
        UnsafeMutablePointer<
        UnsafeMutablePointer<Int8>>>.allocate(capacity: 1)
setPtr(myPointer)
let myInt = myPointer.pointee.pointee.pointee

但是,如果C代码中的setPtr(char *** ptr) (其中_Nonnull是不可用的)执行类似于

代码语言:javascript
复制
*ptr = NULL;

?那么Swift代码将在运行时崩溃。但是,使用optionals时,您不需要在setPtr()的声明中使用_Nonnull注释,您的Swift代码将变为

代码语言:javascript
复制
let myPointer = UnsafeMutablePointer<
        UnsafeMutablePointer<
        UnsafeMutablePointer<Int8>?>?>.allocate(capacity: 1)
setPtr(myPointer)
let myInt = myPointer.pointee?.pointee?.pointee

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39699900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档