iOS8以后苹果公司给出了这2种语言之间的桥接方案,简单来说,就是在Swift过程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起。实际应用较多的主要是Swift中调用OC类,使得在最新的Swift工程中依然能够兼容使用以前的OC类库等。
先建立一个Swift工程,名为SWiftBridge,并分别创建了一个新的名为SwiftClass的Swift类文件和一个名为OCClass的OC类文件,创建第一个OC类的时候会提示创建Bridging头文件,即桥接文件,如图所示:

这里在ViewController.swift中调用OCClass类,在OCClass中调用SwiftClass类
其中,在Swift类中引用OC类时要在Bridging头文件中引入OC类的头文件(Swift中没有头文件及其使用),而在OC类中引用Swift类时,直接引用SWiftBridge-swift.h即可,不需要在Bridging头文件设置。其中SWiftBridge是工程名,该文件是隐藏的,对工程中所有的swift类文件进行了向OC语言的翻译,从而在OC文件中可以像调用其他OC文件一样调用工程中的swift文件。
- 在SwiftClass.swift中定义一个实例方法和一个类方法
@objcMembers
在 Swift 文件中,若要规定固定的方法或属性暴露给 Objective-C 使用,可以在方法或属性前加上 @objc来声明。如果类是继承NSObject,那么要在非 private 的方法或属性前加上@objc(据说swift3.0之前都是系统自动加上的!!!),现在要手动加。也可以在swift类的前面加上@objcMembers这个关键字,这样可以让该类的所有属性和方法加上@objc。【添加后可编译一下】
import UIKit
@objcMembers class SwiftClass: NSObject {
func SwiftInstanceMethod() -> Void {
printf("Swift instance method")
}
class func SwiftClassMethod() -> Void {
printf("Swift class method")
}
}
- 在OCClass类中调用SwiftClass
在需要调用的OC类中引用头文件
#import "SWiftBridge-Swift.h"
具体代码如下:
// OCClass.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface OCClass : NSObject
- (void)OCInstanceMethod;
+ (void)OCClassMethod;
@end
NS_ASSUME_NONNULL_END
// OCClass.m
#import "OCClass.h"
// 引入头文件
#import "SWiftBridge-Swift.h"
@implementation OCClass
- (void)OCInstanceMethod {
// 调用swift实例方法
SwiftClass *swiftc = [[SwiftClass alloc] init];
[swiftc SwiftInstanceMethod];
NSLog(@"OC Instance Method");
}
+ (void)OCClassMethod {
// 调用swift类方法
[SwiftClass SwiftClassMethod];
NSLog(@"OC Class Method");
}
@end
- 在SWiftBridge-Bridging-Header.h中引入OC类头文件供swift类调用
#import "OCClass.h"
- 在ViewController.swift中调用OCClass类
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let occ = OCClass()
occ.ocInstanceMethod()
OCClass.ocClassMethod()
}
}
打印结果如下:
Swift Instance Method
2020-12-29 17:29:36.236222+0800 SWiftBridge[6400:19921310] OC Instance Method
Swift class method
2020-12-29 17:29:36.236402+0800 SWiftBridge[6400:19921310] OC Class Method
网友评论