Swift与C语言指针结合使用实例
Objective-C和C的API常常会需要用到指针。Swift中的数据类型都原生支持基于指针的CocoaAPI,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况。这篇文章中,我们将着眼于在Swift中让C语言指针与变量、数组和字符串共同工作。
####用以输入/输出的参数指针
C和Objective-C并不支持多返回值,所以CocoaAPI中常常将指针作为一种在方法间传递额外数据的方式。Swift允许指针被当作inout参数使用,所以你可以用符号&将对一个变量的引用作为指针参数传递。举例来说:UIColor中的getRed(_:green:blue:alpha:)方法需要四个CGFloat*指针来接收颜色的组成信息,我们使用&来将这些组成信息捕获为本地变量:
varr:CGFloat=0,g:CGFloat=0,b:CGFloat=0,a:CGFloat=0 color.getRed(&r,green:&g,blue:&b,alpha:&a)
另一种常见的情况是Cocoa中NSError的习惯用法。许多方法会使用一个NSError**参数来储存可能的错误的信息。举例来说:我们用NSFileManager的contentOfDirectoryAtPath(_:error:)方法来将目录下的内容列表,并将潜在的错误指向一个NSError?变量:
varmaybeError:NSError? ifletcontents=NSFileManager.defaultManager() .contentsOfDirectoryAtPath("/usr/bin",error:&maybeError){ //Workwiththedirectorycontents }elseifleterror=maybeError{ //Handletheerror }
为了安全性,Swift要求被使用&传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。
####作为数组使用的参数指针
在C语言中,数组和指针的联系十分紧密,而Swift允许数组能够作为指针使用,从而与基于数组的C语言API协同工作更加简单。一个固定的数组可以使用一个常量指针直接传递,一个变化的数组可以用&运算符将一个非常量指针传递。就和输入/输出参数指针一样。举例来说:我们可以用Accelerate框架中的vDSP_vadd方法让两个数组a和b相加,并将结果写入第三个数组result。
importAccelerate
leta:[Float]=[1,2,3,4] letb:[Float]=[0.5,0.25,0.125,0.0625] varresult:[Float]=[0,0,0,0]
vDSP_vadd(a,1,b,1,&result,1,4)
//resultnowcontains[1.5,2.25,3.125,4.0625]