由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型。

而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要将数组转为指针类型,此外也需要将数组中元素内容存放到连续的存储空间。此外,Swift中的字符串对象都是String结构体对象,因此也需要将它们转换为C语言中const char *类型相兼容的类型,因此这里将给大家介绍一些比较简便、且纯Swift接口的使用方法,而不是借助于Objective-C的Foundation库。

/**
此函数用于将一个数组(Array)的首个元素的值做加1操作
- parameters:
- p: inout [Int]类型,传入的数组对象首地址
- returns: Void
*/
func test(inout p: [Int]) {
p[] +=
} class ViewController: NSViewController { override func viewDidLoad() {
super.viewDidLoad() var a = // 下面使用UnsafeMutablePointer自带的alloc类方法分配10个Int元素的存储空间
// 这个方法其实应该就是对malloc函数的封装了,用于外部的C接口十分有用
let buf = UnsafeMutablePointer<Int>.alloc()
let dst = UnsafeMutablePointer<Int>.alloc() // 分别对buf与dst存储空间进行初始化赋值
for i in ..< {
buf[i] = i
dst[i] =
} // 使用assignBackwardFrom将buf存储空间中后5个元素拷贝到dst存储空间的前5个元素中
dst.assignBackwardFrom(buf.advancedBy(), count: ) // 用Array分配一个10个Int元素的数组对象arr
var arr = [Int](count: , repeatedValue: ) // 将dst中的所有元素拷贝到arr中
for i in ..< {
arr[i] = dst[i]
}
print(arr) // 释放buf与dst。注意,这里必须用dealloc来释放,且里面的参数也要与alloc的参数对应!
// 不释放会引发内存泄漏
buf.dealloc()
dst.dealloc() // arr数组对象指向另一个[1, 2, 3]数组字面量构成的Array对象
arr = [, , ] // 调用test函数,使得arr的第一个元素的值加1
test(&arr)
print("arr = \(arr)") // 这里使用Array的withUnsafeMutableBufferPointer方法将数组元素内容转为
// 指向一个连续存储空间的首地址。
// 所以p的类型为:UnsafeMutablePointer<Int>
let p = arr.withUnsafeMutableBufferPointer() {
// 这里,形参是一个含有一个UnsafeMutableBufferPointer的形参,
// 返回类型为UnsafeMutablePointer的函数类型。
(inout buffer: UnsafeMutableBufferPointer<Int>) -> UnsafeMutablePointer<Int> in
return buffer.baseAddress
} a = // 我们先查看原先数组对象中的元素内容
for i in ..< {
a += p[i]
}
print("a = \(a)") // 我们通过p指针对象对数组arr的内容进行修改
p[] -=
p[] +=
p[] += // 然后打印出修改后的arr数组对象中的元素内容
print("arr is: \(arr)") // 这里用nulTerminatedUTF8方法先转为ContiguousArray<CodeUnit>对象类型,
// 其中,CodeUnit是UInt8类型。
// 然后用withUnsafeBufferPointer转为UnsafePointer<CChar>类型
let cstr = "abcd".nulTerminatedUTF8.withUnsafeBufferPointer() {
return UnsafePointer<CChar>($.baseAddress)
} // 这里再将刚才生成的UnsafePointer<CChar>类型的C格式字符串转回String对象
let string = String.fromCString(cstr)!
print("string is: \(string)")
}
}

上述代码中,UnsafeMutablePointer的alloc方法也是个很不错的方法,这个方法应该是直接对C语言标准库malloc的封装,可以使得我们方便地在Swift中分配连续的存储空间,比如对于像图像处理、矩阵计算等算法尤为实用。当然,如果我们的逻辑主要用Array来处理,然后再交给底层的C语言接口做高性能计算,那么也可以使用数组对象转连续存储空间withUnsafeBufferPointer方法,这种处理方式在网络数据通信中也比较实用。

Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法的更多相关文章

  1. 【转】C#语言之“string格式的日期时间字符串转为DateTime类型”的方法

    方法一:Convert.ToDateTime(string) string格式有要求,必须是yyyy-MM-dd hh:mm:ss ================================== ...

  2. C#语言之“string格式的日期时间字符串转为DateTime类型”的方法(转)

    原文链接:http://www.cnblogs.com/Pickuper/articles/2058880.html 方法一:Convert.ToDateTime(string) string格式有要 ...

  3. 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

    一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...

  4. Unity中通过类名字符串取组件类型的方法(Types.GetType用法)

    正常调用Type.GetType取不到组件,因为会先创建实例在获取,而Unity组件无法通过new来创建. 第二种创建方式是通过程序集,具体如下 Assembly.GetExecutingAssemb ...

  5. 计算机二级-C语言-程序修改题-190116记录-对数组进行排序的两种方法。

    //函数fun的功能是:将n个无序整数从小到大排序. //冒泡排序法:小数往下浮,大数往上浮.把数都存到一个数组,然后两两比较,大数往后交换.双层递减循环. //第二种方法:都放入一个数组中,然后记录 ...

  6. js中遍历对象(5种)和遍历数组(6种)的方法总结(转载)

    一.遍历对象方法 1.for...in遍历输出的是对象自身的属性以及原型链上可枚举的属性(不含Symbol属性),原型链上的属性最后输出说明先遍历的是自身的可枚举属性,后遍历原型链上的 eg: var ...

  7. 一览Swift中的常用关键字

    要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  8. Swift 中使用 SwiftyJSON 制作一个比特币价格 APP

    Swift 中处理 JSON 数据有很多种方式,可以使用原生的 NSJSONSerialization,也可以使用很多第三方库.原生的 NSJSONSerialization 方式这篇文章中介绍过.这 ...

  9. 使用swift 中的注意,不断完善中

    1. 应该充分利用swfit的新特性 比如如果按照oc里的习惯,调用一个delegate中都optional函数应该这样写 if delegate != nil && delegate ...

随机推荐

  1. MySQL关键性能监控(QPS/TPS)

    原文链接:http://www.cnblogs.com/chenty/p/5191777.html 工作中尝尝会遇到各种数据库性能调优,除了查看某条SQL执行时间长短外,还需要对系统的整体处理能力有更 ...

  2. 12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

    电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特 ...

  3. 不用ide编译java程序时调用jar包

    调用特定目录下的jar包 javac -cp d:\javatest\dom4j.jar Dom4jDemo.java //这部分必须注意,d:\javatest 是Dom4jDemo.class所在 ...

  4. SpringMVC中使用DWR

    SpringMVC中使用DWR重点在其配置当中. 1.  web.xml文件的配置 在DispatcherServlet中增加dwr的拦截来取代DwrServlet. 更改配置如下: <serv ...

  5. [ASE][Daily Scrum]11.19

    Sprint2已经开始了~今天晚上有课所以今天的plan比较少~ View Shilin Liu 能够看见其他玩家发射出来的子弹 能够看见其他玩家的子弹消失         Client Jiafan ...

  6. 解決BufferedReader读取UTF-8文件中文乱码

    解決BufferedReader读取UTF-8文件中文乱码         File rst01 = new File(context.getRealPath("/")+" ...

  7. iBoxDB for .NET v1.5发布, 移动NoSQL数据库

    iBoxDB for .NET是一个无须安装配置就可以运行的数据库. 拥有非常高效的性能同时能提供事务支持. 可嵌入到应用程序中也可以使用TCP与应用程序进行远程数据交互 使用易用的操作接口,不需要阅 ...

  8. JqueryEasyUI浅谈---视频教程公布

    http://pan.baidu.com/s/1pJqGXez 前两天我在博客园发了一个关于JqueryEasyUI浅谈本地化应用的博客,我简单的介绍了JqueryEasyUI的应用,今天我录制了了一 ...

  9. django CSRF token missing or incorrect

    django 异步请求时提示403 按照一般情况权限问题,python文件没有问题,仔细看了下response里有一句 CSRF token missing or incorrect.这个肯定是因为安 ...

  10. SQL Server 事务语法

    事务全部是关于原子性的.原子性的概念是指可以把一些事情当做一个单元来看待.从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合. 为了理解事务的概念,需要能够定义非常明确的边界. ...