OC和Swift混编的一个简单例子

2017-11-08  本文已影响128人  路CLu

Swift和Objective-C的兼容相互兼容性使得在一个工程里可以方便地使用两种语言,就这个使用场景,本文将介绍

导入到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

上一篇下一篇

猜你喜欢

热点阅读