Swift尽可能避免让我们直接去访问指针。但当我们需要直接访问内存时,我们可以使用Swift提供的几种指针类型。在下面几个表中列出了各种情况下C类型指针语法与Swift语法对应关系,其中Type作为实际类型的占位符
对于函数参数,有以下对应关系
C语法 | Swift语法 |
---|---|
const void * | CConstVoidPointer |
void * | CMutableVoidPointer |
const Type * | CConstPointer |
Type * | CMutablePointer |
对于返回值,变量,二级以上的指针参数,有以下对应关系
C语法 | Swift语法 |
---|---|
void * | COpaquePointer |
Type * | UnsafePointer |
对于类类型,有以下对应关系
C语法 | Swift语法 |
---|---|
Type const | CConstPointer |
Type __strong | CMutablePointer |
Type ** | AutoreleasingUnsafePointer |
下面简单介绍一下这几种类型的指针
C可变指针
当我们声明一个包含CMutablePointer
- nil, 作为空指针传入
- 一个CMutablePointer
值 - 一个in-out表达式,它的操作数是Type类型的左值。该表达式作为左值地址传入
- 一个in-out Type[]值,它作为数组的首地址指针传入,且在调用时扩展了数据的生命周期
假如我们声明了如下一个函数:
|
|
那么我们可以用以下任何一种方式来调用
|
|
当声明一个包含CMutableVoidPointer参数的函数时,它可以接收与CMutablePointer
|
|
C常量指针
当我们声明一个带有CConstPointer
- nil, 作为空指针传入
- 一个CMutablePointer
, CMutableVoidPointer, CConstPointer , CConstVoidPointer, 或者AutoreleasingUnsafePointer 类型的值,如果需要则会转换成CConstPointer - 一个in-out表达式,它的操作数是Type类型的左值。该表达式作为左值地址传入
- 一个in-out Type[]值,它作为数组的首地址指针传入,且在调用时扩展了数据的生命周期
假如我们声明如下函数:
|
|
那么我们可以用以下任何一种方式来调用
|
|
当声明一个包含CConstVoidPointer参数的函数时,它可以接收与CConstPointer
|
|
AutoreleasingUnsafePointer
当我们声明一个带有AutoreleasingUnsafePointer参数的函数时,可以接收以下类型的值:
- nil, 作为空指针传入
- 一个AutoreleasingUnsafePointer
值 - 一个in-out表达式,其操作数是临时非所属(nonowning)缓冲区,存储了原始值的拷贝。缓冲区的地址被传递给调用函数,且在返回时,缓冲区的值被加载(loaded)、保留(retained)并重新指派(reassigned)给操作数
注意上面清单中不包含数组
如果我们声明了以下函数
|
|
则可以用以下方式来调用
|
|
最后需要注意的是在Swift中,没有导入C函数指针。