在Swift中能够直接使用Objective-C语言提供的api (包括系统框架与自己的定制代码),也能够在Objective-C中使用Swift提供的类和api ,还能够在一个工程中同时混合使用Swift 和Objective-C两种语言,两种语言之间能够互通和互用。
任意Objective-C的框架或C库(包括所有的Objective-C系统框架,例如Foundation、UIKit、SpriteKit以及系统提供的公共c库)作为模块被直接导入Swift 供Swift语言使用。
例如为了使用Foundation框架,只需简单的在要使用Foundation框架的Swift文件的顶部添加一个如下的输入声明语句:
import Foundation
这样Foundation 框架包含的所有api包括NSDate、NSURL、NSMutableData以及所有的方法、属性和类别都能被该Swift文件直接使用。
一 、与Objective-C 语言和框架的集成
1.1 对象的实例化
为了在 Swift 中使用某个Objective-C 类,可以使用Swift语法调用它的某个初始化方法进行实例化。
UITableView *myTableView = [[UITableViewalloc]initWithFrame:CGRectZerostyle:UITableViewStyleGrouped];
以上的一个Objective-C 对象的初始化方法在Swift语言中需要这样调用。
let myTableView:UITableView =UITableView(frame:CGRectZero,style: .Grouped)
由于Swift语言自动处理一个实例的内存分配,因此在Swift语言中不需要使用alloc进行内存分配。Objective-C 语言中作为实例初始化方法名字指示的init或 initWith前缀在Swift的初始化语法中也不需要,而用类的名字作为实例初始化方法的名字,跟着Objective-C 语言实例初始化方法名字initWith后面的单词作为Swift的初始化方法的第一个参数使用。
在Swift语言中,实例的初始化语法中对象的类型也可以省掉(如上例的UITableView),Swift可以自动正确地推断其类型,如下所示:
let myTableView=UITableView(frame:CGRectZero,style: .Grouped)
为了一致和简化,Objective-C 的工厂方法在导入Swift时被自动映射为Swift语言的便利初始化方法。例如在Objective-C中如下调用一个工厂方法。
UIColor *color = [UIColorcolorWithRed:0.5green:0.0blue:0.5alpha:1.0];
在Swift语言中,应该这样调用:
let color =UIColor(red:0.5,green:0.0,blue:0.5,alpha:1.0)
1.2 属性和方法的存取
在Swift中使用点语法来存取和设置Objective-C 对象的属性和调用方法。
对于属性的存取在Swift中利用点语法直接使用属性的名字来存取该属性,如:
myTextField.textColor = UIColor.darkGrayColor()
myTextField.text = "Hello world"
对于方法,Objective-C方法名字的第一部分在Swift中直接作为方法名,其余作为Swift方法的参数包括在方法的圆括号中。例如下面的一个Objective-C 方法。
[myTableViewinsertSubview:mySubviewatIndex:2];
在Swift中如下调用。
myTableView.insertSubview(mySubview,atIndex:2)
在Objective-C中的id类型 在导入Swift时被映射为Swift语言的AnyObject类型。
在Objective-C中的指针在导入Swift时被映射为Swift语言的optional类型。
1.3 扩展功能
能够使用扩展为Objective-C语言中已定义的类、结构和枚举(包括系统框架中或自己定义的)添加和扩展功能。
如使用扩展来添加属性(包括类和静态属性),扩展的属性必须是计算属性。如下所示使用扩展为CGRect类添加了一个计算属性area:
extension CGRect {
var area:CGFloat {