Swift和Objective-C的兼容相互兼容性使得在一个工程里可以方便地使用两种语言,就这个使用场景,本文将介绍
- 如何将 Swift 导入到 Objective-C
- 如何将 Objective-C 导入到Swift
- 一个简单的例子
- | 导入到Swift | 导入到Objective-C |
---|---|---|
Swift | 不需要import 语句 | #import "ProductModuleName-Swift.h" |
Objective-C | 不需要import 语句,需要Objective-C bridging 头文件 | #import "header.h" |
一个简单的例子
我们模拟一个项目,以前的控制器和工具类代码都是用OC编写,现在我们要用Swift编写新的代码,一般的,以前OC代码会调用新编写的Swift代码,Swift代码也需要调用OC的工具类。
1. 设置Target>setting
将框架 target 的 Build Settings > Packaging > Defines Module 设置为 Yes
setting.png
2.新建Swift文件
在OC项目中第一次新建Swift文件时,系统会自动提示创建 Bridging 头文件,如文章开头表格所示,该文件用于将OC导入到Swift。
creatASwiftFile.png
3.将OC导入到Swift
我们用Swift写了一个View,这个view被点击时会掉用OC的工具类OCTools
的方法
1、在SwiftAndOC-Bridging-Header.h
文件里#import "OCTools.h"
2、在Swfit文件里调用OCTools
的方法
import UIKit
class SwiftView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
initSubViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func initSubViews(){
self.backgroundColor = UIColor.lightGrayColor()
let dotView = UIView(frame: self.bounds)
dotView.center = self.center
dotView.layer.masksToBounds = true
dotView.layer.cornerRadius = self.bounds.size.height/2
dotView.layer.borderWidth = 1
dotView.layer.borderColor = UIColor.blackColor().CGColor
self.addSubview(dotView)
let tap = UITapGestureRecognizer(target: self, action: #selector(tapDotAction))
dotView.addGestureRecognizer(tap)
}
@objc private func tapDotAction(){
OCTools.logWithText("Don't touch me!")
}
}
3.将Swift导入到OC
我们用Swift编写的view需要在OC写的控制器里被调用
1、在控制器里#import "SwiftAndOC-swift.h"
,注意这里的头文件时系统自动生成,格式是 "Your Product Name"-swift.h
2、调用Swift的类
#import "ViewController.h"
#import "SwiftAndOC-swift.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
SwiftView *sView = [[SwiftView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
sView.center = self.view.center;
[self.view addSubview:sView];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
For more information please visitUsing Swift with Cocoa and Objective-C:Swift and Objective-C in the Same Project
网友评论