Swift 自己从设计上来讲是一门很是安全的语言,在 Swift 的思想中,全部的引用或者变量的类型都是肯定而且正确对应它们的实际类型的,你应当没法进行任意的类型转换,也不能直接经过指针作出一些出格的事情。这种安全性在平常的程序开发中对于避免没必要要的 bug,以及迅速并且稳定地找出代码错误是很是有帮助的。可是凡事都有两面性,在高安全的同时,Swift 也相应地丧失了部分的灵活性。设计模式
现阶段想要彻底抛弃 C 的一套东西仍是至关困难的,特别是在不少上古级别的 C API 框架还在使用 (或者被间接使用)。开发者,尤为是偏向较底层的框架的开发者不得不面临着与 C API 打交道的时候,仍是没法绕开指针的概念,而指针在 Swift 中其实并不被鼓励,语言标准中也是彻底没有与指针彻底等同的概念的。为了与庞大的 C 系帝国进行合做,Swift 定义了一套对 C 语言指针的访问和转换方法,那就是 UnsafePointer 和它的一系列变体。对于使用 C API 时若是遇到接受内存地址做为参数,或者返回是内存地址的状况,在 Swift 里会将它们转为 UnsafePointer<Type> 的类型,好比说若是某个 API 在 C 中是这样的话:数组
其对应的 Swift 方法应该是:安全
咱们这个 tip 所说的 UnsafePointer,就是 Swift 中专门针对指针的转换。对于其余的 C 中基础类型,在 Swift 中对应的类型都遵循统一的命名规则:在前面加上一个字母 C 并将原来的第一个字母大写:好比 int,bool 和 char 的对应类型分别是CInt,CBool 和 CChar。在上面的 C 方法中,咱们接受一个 int 的指针,转换到 Swift 里所对应的就是一个 CInt 的 UnsafePointer 类型。这里原来的 C API 中已经指明了输入的 num 指针的不可变的 (const),所以在 Swift 中咱们与之对应的是 UnsafePointer 这个不可变版本。若是只是一个普通的可变指针的话,咱们可使用 UnsafeMutablePointer 来对应:框架
在 C 中,对某个指针进行取值使用的是 *,而在 Swift 中咱们可使用 memory 属性来读取相应内存中存储的内容。经过传入指针地址进行方法调用的时候就都比较类似了,都是在前面加上 & 符号,C 的版本和 Swift 的版本只在声明变量的时候有所区别:性能
遵照这些原则,使用 UnsafePointer 在 Swift 中进行 C API 的调用应该就不会有很大问题了。插件
另一个重要的课题是如何在指针的内容和实际的值之间进行转换。好比咱们若是因为某种缘由须要涉及到直接使用 CFArray 的方法来获取数组中元素的时候,咱们会用到这个方法:设计
由于 CFArray 中是能够存听任意对象的,因此这里的返回是一个任意对象的指针,至关于 C 中的 void *。这显然不是咱们想要的东西。Swift 中为咱们提供了一个强制转换的方法 unsafeBitCast,经过下面的代码,咱们能够看到应当如何使用相似这样的 API,将一个指针强制按位转成所需类型的对象:3d
unsafeBitCast 会将第一个参数的内容按照第二个参数的类型进行转换,而不去关心实际是否是可行,这也正是 UnsafePointer 的不安全所在,由于咱们没必要遵照类型转换的检查,而拥有了在指针层面直接操做内存的机会。指针
其实说了这么多,Apple 将直接的指针访问冠以 Unsafe 的前缀,就是提醒咱们:这些东西不安全,亲们能不用就别用了吧 (做为 Apple,另外一个重要的考虑是若是避免指针的话能够减小不少系统漏洞)!在平常开发中,咱们确实不太须要常常和这些东西打交道 (除了传入 NSError 指针这个历史遗留问题之外,并且在 Swift 2.0 中也已经使用异常机制替代了 NSError)。总之,尽量地在高抽象层级编写代码,会是高效和正确的有力保证。无数先辈已经用血淋淋的教训告诉咱们,要避免去作这样的不安全的操做,除非你确实知道你在作的是什么。orm
开源框架 RSA_Swift
iOS SKStoreProductViewController的应用
CocoaPods开源库的搭建
CocoaPods搭建私有库
CocoaPods搭建私有库遇到问题
CocoaPods私有库的升级维护
SKStoreReviewController之程序内评价
App应用程序图标的动态更换
开源框架 MGJRouter_Swift
iOS的MVP设计模式
iOS插件化
iOS FMDB的使用
Swift之ReactiveSwift
OC之ReactiveCocoa
OC之ReactiveCocoa进阶
iOS 性能考虑