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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,224评论 4 61
  • 概述 利用runtime特性实现iOS项目的组件化开发,是由@casatwy大神提出来的,在他的博客中具体介绍...
    Mr杰杰阅读 1,631评论 2 9
  • 昨晚舞蹈班结课放寒假啦,小隐老师特别用心地给我们拍了视频,说要剪辑好,送给我们做新年礼物。说实话,和这样一群爱生活...
    极简夏小囧阅读 180评论 1 3
  • 1 一位读者给我留言,身边有许多年纪轻轻却想着辍学的少年,不知如何是好。 读者说,阿夜,你写一篇关于劝学的文章吧!...
    十三夜阅读 5,852评论 32 213