Swift和OC混编

42 篇文章 0 订阅
21 篇文章 0 订阅

Swift项目桥接OC文件(在Swift类中引用OC类及方法)

  • 如果是初次在Swift中创建添加OC文件,会提示创建桥接文件Create Bridging Header,点击后会生产对应的OC文件和一个xxx-Bridging-Header.h,文件,我们只需要在该文件中导入OC文件头文件就可以直接使用,不需要在Swift文件中再导入OC文件的头文件。
    Create Bridging Header
    Create Bridging Header
    生成的OC文件和.h文件,并导入头文件
    生成的OC文件和.h文件,并导入头文件

  • Swift中调用OC文件的方法,桥接文件中导入的OC类头文件都可以在Swift中以Swift语法直接调用

import UIKit
class ViewController: UIViewController {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let ocvc =  OCViewController()
        present(ocvc, animated: true) {
          print("跳转完成")
        }
    }   
}
  • OC文件调用Swift方法,不用显式地新建桥接文件,那是因为系统会在编译期自动生成桥接文件,我们只要按规则调用即可索引到想要的Swift类。在Objective-C Bridging Header下面的一行Objective-C Generated Interface Header Name,可以看到其命名为项目名称-Swift.h
    OC调Swift
    这里需要说明的是:如果项目名称有空格或-,这个桥接头文件会将空格和-转换为_,除此之外还可以修改项目名称已达到去掉空格和-,build Setting -> Packaging -> Product Name,改成想改成的名称即可:
    修改Product Name
    在OC中调用Swift时直接导入对应Product Name-Swift.h,即可在OC中以OC的方式调用Swift方法。
#import "OC2ViewController.h"
#import "SwiftOC-Swift.h"

@implementation OC2ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    [self dismissViewControllerAnimated:YES completion:nil];
    ViewController * swiftVC = [[ViewController alloc]init];
    [self presentViewController:swiftVC animated:YES completion:nil];   
}
@end
  • 当创建OC文件时,选择了Cancel,就不会生成桥接文件,并且以后再次创建OC文件也不会提示创建桥接文件,这样就需要我们手动创建桥接文件。
    新建一个header文件
    在项目target下的build Setting -> Swift Compiler - General ->Objective-C Bridging Header将桥接文件路径设置上去。
    手动生产和添加桥接文件

OC项目桥接Swift文件(在Swift类中引用OC类及方法)

  • 虽然在OC项目引入Swift文件的情况很少,但毕竟也还是存在的。其实和上面一样,在第一创建Swift文件时会自动产生桥接文件(注意这个桥接文件也是导入OC类头文件的,而不是Swift文件),如果选择了取消也可以手动创建,可以说是完全一模一样,这里就不一一赘述了。

注意事项

  • 不管是OC项目还是Swift项目生成的桥接文件都是要导入OC类头文件,是为了Swift类中取调用OC的方法。如果是OC项目中只有OC类调用Swfit方法,Swfit类不调用OC方法,完全可以不要这个桥接文件。
  • OC类中调用Swift方法,xcode自动生成了桥接文件,只需要导入项目名称-Swift.h头文件即可调用该Swift方法。如果以个工程中有多个target,即有多个项目,这个生成的项目名称-Swift.h桥接文件名称是不一样都,注意不要调错了,否则会报找不到文件的错误。
  • 如果我们选择编译语言为Swift4时,如果OC类要想调用Swift方法或属性,则Swift方法或属性前面必须加上@objc;
//swift方法
@objc func test(){
        print("swift方法")
    }
//ocl类中调用
#import "OCSwift2-Swift.h"
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    SwiftViewController * swiftvc = [[SwiftViewController alloc]init];
    [swiftvc test];
    [self presentViewController:swiftvc animated:YES completion:nil];
}

相关demo下载:
Swift和OC混编demo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值