Swift中的指针操作和使用详细介绍

2020-01-08 22:46:29于丽
易采站长站为您分析Swift中的指针操作和使用详细介绍,Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象,本文详细讲解了Swift中指针的相关知识,需要的朋友可以参考下  

Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象。这在一定程度上造成了在Swift中指针使用的困难,特别是对那些并不熟悉指针,也没有多少指针操作经验的开发者(包括我自己也是)来说,在Swift中使用指针确实是一个挑战。在这篇文章里,我希望能从最基本的使用开始,总结一下在Swift中使用指针的一些常见方式和场景。这篇文章假定你至少知道指针是什么,如果对指针本身的概念不太清楚的话,可以先看看这篇五分钟C指针教程(或者它的中文版本),应该会很有帮助。

初步

在Swift中,指针都使用一个特殊的类型来表示,那就是UnsafePointer<T>。遵循了Cocoa的一贯不可变原则,UnsafePointer<T> 也是不可变的。当然对应地,它还有一个可变变体,UnsafeMutablePointer<T>。绝大部分时间里,C中的指针都会被以这两种类型引入到Swift中:C中const修饰的指针对应UnsafePointer(最常见的应该就是C字符串的const char *了),而其他可变的指针则对应UnsafeMutablePointer。除此之外,Swift中存在表示一组连续数据指针的UnsafeBufferPointer<T>,表示非完整结构的不透明指针COpaquePointer等等。另外你可能已经注意到了,能够确定指向内容的指针类型都是泛型的struct,我们可以通过这个泛型来对指针指向的类型进行约束以提供一定安全性。

对于一个UnsafePointer<T>类型,我们可以通过memory属性对其进行取值,如果这个指针是可变的UnsafeMutablePointer<T> 类型,我们还可以通过memory对它进行赋值。比如我们想要写一个利用指针直接操作内存的计数器的话,可以这么做:

复制代码
func incrementor(ptr: UnsafeMutablePointer<Int>) {  
    ptr.memory += 1  
}  
var a = 10  
incrementor(&a)  
a  // 11  

 

这里和C的指针使用类似,我们通过在变量名前面加上&符号就可以将指向这个变量的指针传递到接受指针作为参数的方法中去。在上面的incrementor中我们通过直接操作memory属性改变了指针指向的内容。

与这种做法类似的是使用Swift的inout关键字。我们在将变量传入inout参数的函数时,同样也使用&符号表示地址。不过区别是在函数体内部我们不需要处理指针类型,而是可以对参数直接进行操作。