Swift使用Cocoa中的数据类型教程

2020-01-08 22:49:47刘景俊

复制代码
let size = NSSize(width: 20, height: 40)

 

覆盖方法也允许你以一种自然的方式调用 Foundation 的结构函数。

复制代码
let rect = NSRect(x: 50, y: 50, width: 100, height: 100)
let width = rect.width // equivalent of NSWidth(rect)
let maxX = rect.maxY // equivalent of NSMaxY(rect) 

 

Swift可以将NSUInteger和NSInteger转换为Int类型。这些类型都会在 Foundation APIs 中变为Int类型。在 Swift 中Int常被尽可能地用以连贯性,同时当你要求一个无符号整数类型时,UInt类型总是可使用的。

Foundation函数

在 Swift 中,NSLog可在系统控制台输出信息。您可以像在 Objective-C 中使用过的语法格式那样使用此函数。

 

复制代码
NSLog("%.7f", pi)  // Logs "3.1415927" to the console 

 

同时,Swift 也提供像print和println那样的输出函数。多归于 Swift 的字符插值机制才让这些函数简单,粗暴,多效。这些函数不会在系统控制台输出信息,但在需要调用的时候却是可用的。

Swift 中不再存在NSAssert函数,取而代之的是assert函数。

Core Foundation

Swift中的 Core Foundation 类型是一个成熟的类。当出现内存管理注释时,Swift 会自动地管理 Core Foundation 对象的内存,这其中包括你实例化了的 Core Foundation 对象。在 Swift 中,你可以自由变换 Fundation 和 Core Foundation 类型。如果你想先转换为桥接 Foundation 类型时,你也可以桥接一些 toll-free bridged Core Foundation 类型到 Swift 标准库类型。

重定义类型

当 Swift 导入 Core Foundation 类型时,编译器会重映射导入的类型名字。编译器会从每个类型名字的末端移除Ref,这是因为所有的 Swift 类都属于引用类型,因此后缀是多余的。

Core Foundation 中的CFTypeRef类型会对Anyobject类型重映射。所以你以前使用的CFTypeRef,现在该换成AnyObject了。

内存管理对象

在 Swift 中,从 annotated APIs 返回的 Core Foundation 对象能够自动进行内存管理--你不再需要调用自身的CFRetain,CFRelease,或者CFAutorelease函数。如果你从自身的C函数和 Objective-C 方法中返回一个 Core Foundation 对象,你需要用CF_RETURNS_RETAINED或者CF_RETURNS_NOT_RETAINED注释这个对象。当 Swift 代码中包含这些 APIs 时,编译器会在编译时自动调用内存管理。如果你只调用那些不会间接返回 Core Foundation 对象的 annotated APIs,那么现在你可以跳过本节的剩余部分了。否则,下面我们继续学习非托管的 Core Foundation 对象。