iOS: 学习笔记, Swift与C指针交互(译)

iOS: 学习笔记, Swift与C指针交互(译)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Swift与C指针交互

Objective-C和C API经常须要使用指针. 在设计上, Swift数据类型能够自然的与基于指针的Cocoa API一起工作, Swift自己主动处理几种经常使用的指针參数. 在本文中, 我们将看到C中的指针參数怎样与Swift中的变量,数组,字符串一起工作.

指针作为输入/输出參数

C和Objective-C不支持多个返回值, 所以Cocoa API常常使用指针传递附加參数到函数. Swift同意把指针參数看成[inout]參数, 所以你能够用相同的&语法传递一个变量的引用作为指针. 比如: UIColor的getRed(_:green:blue:alpha:)方法使用4个CGFloat*指针来接受颜色的组合. 我们能够用&来得到这些值:

var r: CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
color.getRed(&r, green: &g, blue: &b, alpha: &a)

还有一个常常使用的是NSError. 很多方法使用了NSError*參数来保存发生的错误. 比如: 我们列举文件夹里的内容使用NSFileManager的contentsOfDirectoryAtPath(_:error:)方法, 直接使用NSError?变量来保存可能的错误:

复制代码
var maybeError:NSError?
  if let contents = NSFileManager.defaultManager().contentsOfDirectoryAtPath("/usr/bin", error: &maybeError){
      //内容处理
      for i in contents{
          println(i)
      }
  }else if let error = maybeError{
      //错误处理
      println(error.description)
  }
复制代码

安全起见, Swift要求变量在使用&前须要初始化. 由于它不知道被调用的方法是否在改动它之前会读取指针

数组指针

在C中数组与指针紧紧相连. 为方便使用基于数组的C API, Swift同意将Array作为指针. 不可改动数组能够直接当成常量指针, 可改动数组能够使用&操作符做为很量指针(就和inout參数一样). 比如: 我们把两个数组 a 和 b 使用vDSP_vadd函数(Accelerte framework)相加, 把结果写到第三个数组 result 中:

复制代码
  import Accelerate

  let a: [Float] = [1, 2, 3, 4]
  let b: [Float] = [0.5, 0.25, 0.125, 0.0625]
  var result: [Float] = [0, 0, 0, 0]

  vDSP_vadd(a, 1, b, 1, &result, 1, 4)

  // result now contains [1.5, 2.25, 3.125, 4.0625]
复制代码

字符串指针

C使用 const char*指针作为传递字符串的主要方式. Swift String能够作为const char*指针, 它会给函数传递一个 null结束, UTF-8编码的字符串指针. 比如, 我们能够直接给标准C和POSIX库函数传递字符串:

复制代码
  puts("Hello from libc")
  let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666)
  
  if fd < 0 {
      perror("could not open /tmp/scratch.txt")
  } else {
      let text = "Hello World"
      write(fd, text, strlen(text))
      close(fd)
  }
复制代码

指针參数转换的安全性
Swift尽可能让与C指针的交互方便并提供了一定的安全性, 由于C指针无处不在. 可是, 与C指针交互相对于Swift代码来说还是内存的不安全, 因此须要特别注意. 特别的:
* These conversions cannot safely be used if the callee saves the pointer value for use after it returns. The pointer that results from these conversions is only guaranteed to be valid for the duration of a call. Even if you pass the same variable, array, or string as multiple pointer arguments, you could receive a different pointer each time. An exception to this is global or static stored variables. You can safely use the address of a global variable as a persistent unique pointer value, e.g.: as a KVO context parameter.
* Array和String指针没有边界检查. C API不会扩大数组和字符串, 因此在调用前你须要为它分配足够的大小

假设上面的指南不满足你指针交互的须要, 或者你想手动控制指针參数, 你能够直接使用unsafe指针操作内存. 我们会在将来的文章中看到很多其它高级应用.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118055.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • .net 调用java WebService简单教程

    .net 调用java WebService简单教程java滴WebService配置比较复杂tomcat+jdk+cxf+spring+(strtus)看你心情吧==首先·创建一个··WebProject把cxf里面的lib再再里面的库复制到你的工程下···我java菜吖··不知道哪些必须滴···懒人全都放进去额接着开始写代码啦··packagecom.ws;importjavax.jws.WebService;@WebServicepublicinterfaceIHello{ publicStringHelloWord(

  • 查看是否安装了webpack_封装webpack

    查看是否安装了webpack_封装webpack报错信息:解决方法:1.npminstall-gwebpack-cli2.npminstall–save-devwebpack-cli//同步到局部项目文件夹下再次检查版本成功!但是提示:webpack-dev-servernotinstalled于是再次执行命令:npminstall–save-devwebpack-dev-server成功!…

  • oracle表字段为汉字,依据拼音排序

    oracle表字段为汉字,依据拼音排序

  • win10 pycharm安装教程_社区版pycharm安装教程

    win10 pycharm安装教程_社区版pycharm安装教程一、官网下载安装包:https://www.jetbrains.com/pycharm/download/#section=windows这里下载的是Pycharm社区版:二、安装Pycharm安装前先在本地新建一个文件夹,后面把pycharm安装在指定路径:1、直接双击运行,点击Next:2、选择指定路径安装,并继续点击Next:3、继续下一步,全部勾选,点击Next:4、接着点击Install安装:5、安装完成,点击f…

  • Android DeepLink介绍与使用

    Android DeepLink介绍与使用前段时间公司让调研一下DeepLink,说以后会用到,之前看了很久,并做了个demo,现整理一下,方便以后查阅,如果有幸帮助到其他人就更好了。基本概念DeepLink,又叫deeplinking,中文翻译作深层链接。简单地从用户体验来讲,DeepLink,就是可以让你在手机的浏览器/GoogleSearch上点击搜索的结果,便能直接跳转到已安装的应用中的某一个页面的技术。对于不…

  • Python文件写入txt_python创建文件并写入内容

    Python文件写入txt_python创建文件并写入内容文件写入txt

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号