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指针操作内存. 我们会在将来的文章中看到很多其它高级应用.

时间: 2024-10-14 20:16:39

iOS: 学习笔记, Swift与C指针交互(译)的相关文章

iOS: 学习笔记, Swift与Objective-C混用总结

Swift与Objective-C交互总结 在Swift中使用Objective-C(简单) 在创建OjbC文件时, XCode会提示创建XXX-Bridging-Header.h文件, 创建之 在创建的XXX-Bridging-Header.h上导入需要引入到Swift中的Objective-C类 #import "Need.h" 然后在Swfit中就能使用它了 在Ojbective-C中使用Swift(非常简单) 在相应的OjbC文件中加入 #import "XXX-Sw

iOS: 学习笔记, Swift操作符定义

Swift操作符可以自行定义, 只需要加上简单的标志符即可. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @assignment 赋值运算. +=, -=, --a, ++a // // main.swift // SwiftBasic // // Created by yao_yu on 14-7-27. // Copyright (c) 2014年 yao_yu. All rights reserved.

iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)

Swift与Objective-C混用简明教程 转载自:https://github.com/lifedim/SwiftCasts/tree/master/000_mix_swift_objc 我想很多iOS开发者在知道Swift后,心中最大的问题就是如何将Swift应用到原有项目之中.下面我将简要介绍这2种语言的混用方法,内容参考自官方文档 Using Swift with Cocoa and Objective-C ,推荐大家阅读. 在Swift中使用Objective-C类 在Xcode6

iOS: 学习笔记, swift扩展

// // YYExtension.swift // // Created by yao_yu on 14-7-18. // Copyright (c) 2014年 yao_yu. All rights reserved. // import Foundation extension String{ func strip() -> String{ return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineC

swift学习笔记-----swift中的指针

swift语言为了简化,把指针隐形化了.没有像OC中那样的" * ".把底层的问题交给C语言去处理,我们可以在swift中调用C 语言来解决.当然,OC也是可以调用的. 但是在某些场景下,这种调用可能不是很方便.比如,基于字节流的解析中,这时我们所接受的数据是要进行解析,可能用到指针.如果在C中去调用,当然也是可以的.但如果想写的简洁一些,用swift直接去处理这些,是否可以呢.那就要看在swift中是否很好的去使用指针呢. 事实上,swift是支持使用指针的.苹果已经公开了swift

iOS: 学习笔记, Swift名字空间

在Swift中, 名字空间是用class(extension)嵌套来实现的, 以下用一个简单样例来进行展示 // // main.swift // SwiftNameSpace // // Created by yao_yu on 14-8-1. // Copyright (c) 2014年 yao_yu. All rights reserved. // // Swift名字空间使用实例 // import Foundation //定义顶层名字空间 class YY{ } //在YY名字空间中

ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整的学习完所需知识,,其他文件夹的内容如其名说描述一样 没张图片都有文字说明,可以需要该功能的时候搜索一下然后打开图片就可以学习到 网盘下载地址:需要的话给留言我再传上去 http://www.cnblogs.com/langtianya原创 ios学习笔记图片+图片解释(c语言 oc语言 ios控件

iOS: 学习笔记, 用代码驱动自动布局实例(swift)

iOS自动布局是设置iOS界面的利器.本实例展示了如何使用自动布局语言设置水平布局, 垂直布局1. 创建空白iOS项目(swift)2. 添加一个控制器类, 修改YYAppDelegate.swift文件 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFi

iOS: 学习笔记, 值与引用类型(译自: https://developer.apple.com/swift/blog/ Aug 15, 2014 Value and Reference Type

值和引用类型 Value and Reference Types 在Swift中,有两种数据类型. 一是"值类型"(value type), 它是每一个实例都保存有各自的数据,通常定义为struct, enum或tuple. 二是"引用类型"(reference types),它是多实例共享一份数据,这种类型通常定义为class. 在本文中,我们将展示值类型和引用类型各自的优点以及如何在二者之间选择. 它们有什么区别? 最基本的区别是 "值类型"