全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法

详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法

由于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[0] += 1
}

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

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

如有疑问请留言或者到本站社区交流讨论,本站关于IOS 开发的文章还有很多,希望大家能搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Swift中对C语言接口缓存的使用  # IOS  # 开发中数组与字符串转为指针类型的方法  # 从头学习C语言之if语句的使用  # Swift与C语言指针结合使用实例  # C语言if选择结构语句详解  # C语言 if else 语句详细讲解  # 详解C语言中条件判断语句if和switch的用法  # C语言中#if的使用详解  # 编程语言  # 要将  # 高性能  # 也需  # 象中  # 都是  # 是一个  # 是个  # 第一个  # 也要  # 如有  # 而在  # 希望能  # 拷贝到  # 数据通信  # 然后再  # 很不错  # 可以使用  # 中也  # 自带 


相关文章: 如何实现建站之星域名转发设置?  建站之星上传入口如何快速找到?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  定制建站哪家更专业可靠?推荐榜单揭晓  TestNG的testng.xml配置文件怎么写  怎么将XML数据可视化 D3.js加载XML  如何用西部建站助手快速创建专业网站?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何通过服务器快速搭建网站?完整步骤解析  建站之星各版本价格是多少?  建站VPS选购需注意哪些关键参数?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  javascript基本数据类型及类型检测常用方法小结  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何通过山东自助建站平台快速注册域名?  Bpmn 2.0的XML文件怎么画流程图  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  Python多线程使用规范_线程安全解析【教程】  如何自定义建站之星网站的导航菜单样式?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何快速启动建站代理加盟业务?  建站之星代理如何获取技术支持?  如何通过wdcp面板快速创建网站?  长沙做网站要多少钱,长沙国安网络怎么样?  如何用免费手机建站系统零基础打造专业网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  SQL查询语句优化的实用方法总结  制作销售网站教学视频,销售网站有哪些?  宝塔建站助手安装配置与建站模板使用全流程解析  在线制作视频网站免费,都有哪些好的动漫网站?  ,有什么在线背英语单词效率比较高的网站?  如何选择最佳自助建站系统?快速指南解析优劣  如何快速选择适合个人网站的云服务器配置?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  建站之星后台管理系统如何操作?  建站之星如何优化SEO以实现高效排名?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何设置并定期更换建站之星安全管理员密码?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  如何在自有机房高效搭建专业网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  高防服务器租用如何选择配置与防御等级?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何零基础开发自助建站系统?完整教程解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。