OC+Swift混编
随着2014年WWDC推出Swift以后,这个新的脚本语言受到广大开发者的青睐,然而由于很多第三方库依旧用的是OC, 或者现有代码是用OC写的,所以如果想用Swift,更多的情况会是在混编下完成的。所幸混编并不复杂,唯一的缺陷就是会让你的包更大(详情见网页<Swift Embedded Runtime Library Increases App Size>).
接下来让我们用一个简单的例子来实现混编,首先以ObjectiveC为主要语言创建一个项目:<ObjectiveSwift>
接下来创建一个Swift文件,用来新建一个SwiftObject对象:
这里选择 Yes , 然后会生成一个‘桥接’头文件,用来向Swift声明哪些ObjectiveC文件可用,值得一提的是,在混编项目中会有两个桥接头文件:
一个是用来向Swift暴露OC的(OC->Swift),系统会自动命名为:
<项目名-Bridging-Header>,即 ObjectiveSwift-Bridging-Header.h
另一个是向OC暴露Swift的头文件(Swift->OC),这个文件会被命名为:
<项目名-Swift.h>,即 ObjectiveSwift-Swift.h,这个文件是不可见的,虽然也是自动生成,但是在项目里面是找不到这个文件的,按住command然后跟踪对象方法可以进入这个文件,可以看到所有Swift对象及其方法会被生成到这个文件里。
OC调用Swift
比如,新建一个Swift对象:(SwiftObject.swift)
import Foundation
import UIKit
class SwiftObject:NSObject{
func say(){
println("Output from Swift")
}
}
如果希望在OC中调用这个对象的say方法,就需要在OC文件中import "ObjectiveSwift-Swift.h". 然后使用方式跟使用OC对象一样:(ViewController.m)
#import "ViewController.h"
#import "ObjectiveSwift-Swift.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
SwiftObject *obj = [[SwiftObject alloc] init];
[obj say];
}
@end
按住command跟踪
ObjectiveSwift-Swift.h
文件可以看到这个‘不可见’的文件,可以看到里面有Swift的对象以及方法:
Swift调用OC
先创建一个OC对象 OCObject:
<span style="font-size:18px;">#import "OCObject.h"
@implementation OCObject
- (void) say{
NSLog(@"Output from ObjectiveC");
}
@end</span>
为了让Swift能调用这个对象,需要将此文件暴露给Swift, 所以要在‘桥接’头文件中引入这个对象的头文件:
然后在Swift对象里就可以调用这个对象了,并且无需单独再引入头文件,直接可用:
<span style="font-size:18px;">import Foundation
import UIKit
class SwiftObject:NSObject{
func say(){
println("Output from Swift")
}
func sayFromOC(){
var ocObj = OCObject.new()
ocObj.say()
}
}</span>