Swift与OC的混编

简介: Swift调用OC文件OC调用Swift文件

目录


    一、OC调用Swift文件

         1、配置

         2、 创建xxx.swift文件类:

         3、文件导入

   二、Swift调用OC文件


一、OC调用Swift文件


在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,如下图:


71474316770974473.jpg


点确定创建桥接文件,Xcode会自动创建一个桥接文件,其名字为:工程名-Bridging-Header.h

165919713604642591.jpg


这个桥接文件是 swift 调用OC文件的时候用的


1、配置


进入TARGETS ->Build Settings -> Packaging 中设置Defines Module为YES。


758107955281785551.jpg

设置Product Module Name (如:OCBrigdeSwiftDemo),也可以不设置,默认为工程的名字。这个在后面会用到。


758107955281785551.jpg

2、 创建xxx.swift文件类:

import UIKit
class Tools: NSObject {
    var address:String
    var gender:String
    init(address:String,gender:String) {
        self.address = address
        self.gender = gender
    }
    func methodprintOC(){
        print("msg:\(self.address) + \(self.gender)")
    }
}


3、文件导入

在OC需要用到的swift文件中 导入文件 “Product Module Name -Swift.h” 因为 Product Module Name 默认是工程的名字。所以直接导入 #import “工程名-Swift.h”,【该文件没有提示、是能手写补充】

#import "ViewController.h"
#import "OCBrigdeSwiftDemo-Swift.h"


###4.方法调用


记着写完先command+B编译一下,如果没有报错就可以在OC文件调用swift中的类了

#import "ViewController.h"
#import "OCBrigdeSwiftDemo-Swift.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self ocBridgeSwift];
}
#pragma mark - method
///oc初始化调用swift方法
-(void)ocBridgeSwift{
    Tools *tools = [[Tools alloc]initWithAddress:@"地址" gender:@"性别"];
    [tools methodprintOC];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end


二、Swift调用OC文件


  • 只要把swift需要用到的OC文件的头文件放到桥接文件里 工程名-Bridging-Header.h

示例:

####1、创建一个oc的文件(OTools)

(void)logWithAddress:(NSString *)address gender:(NSString *)gender{
    NSLog(@"打印日志:\n 地址:%@ 性别:%@",address,gender);
}
-(void)logByAddress:(NSString *)address gender:(NSString *)gender{
    [OTools logWithAddress:address gender:gender];
}


####2、在 xxx-Header.h文件中添加头文件


#import "OTools.h"


####3、调用


command+s [混编时,每次代码更新都要保存,不然无法调用]保存文件

override func viewDidLoad() {
        super.viewDidLoad()
        self.initBaseData();
    }
    func initBaseData(){
        OTools .log(withAddress: "北京市", gender: "男");
        let tools = OTools.init()
        tools.log(byAddress: "福建省", gender: "女");
    }

 

##三、注意和总结


注意:


1、OC项目在导入swift文件前 先按照系统提示创建桥接文件,


2、在 targets -> Build Settings -> Packaging 中设置Defines Module 为YES


3、OC中调用swift文件需要导入”工程名 -Swift.h"


(这个是build Setting -> Packaging->Product Module Name 的名字,而这个属性默认是工程的名字)


4、每次写完记得command + B 编译 一下

5、swift项目 引用OC文件也需要创建 桥接文件,在这个桥接文件中导入OC文件的头文件

6、桥接文件只有一个,作用只是为了 swift 引用OC文件,OC引用swift 文件虽然也需要创建桥接文件,但是不需要在桥接文件中 导入swift文件

7、如果一个项目既有OC引用swift也有swift引用OC,就先设置OC调用swift文件,在桥接文件 导入OC文件,OC可以定义PCH文件导入”工程名 -Swift.h"


##四、自定义桥接文件


如果不用Xcode提示创建桥接文件也可以自定义一个桥接文件


1、使用 Header File 创建,把里面的内容清空。


2、这文件名可以自定义, 一般还是用工程名-Bridging-Header.h。


3、然后在 Build Setting -> Bridging Header 中 设置Objective-C Bridging Header 为自定义的桥接文件相对于工程的绝对路径,也就是项目总文件夹的路径,如果在第一层,就直接写自定义的桥接文件的名file.h,如果在下一层,文件夹/桥接文件 app/file.h


449826720942823141.jpg


4、最后进入TARGETS ->Build Settings -> Packaging 中设置Defines Module为YES


 记:oc与swift之间的属性传值、代理传值、代码块、方法调用、通知调用,请参考:OC与swift的数据传输

 gitee地址:https://gitee.com/chenzm_186/OCBrigdeSwiftDemo

 github地址:https://github.com/chzm/OCBridgeSwift




相关文章
|
7月前
|
Swift Perl
OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
129 0
|
API Swift iOS开发
45 Swift和OC的混编
Swift和OC的混编
131 0
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
90 0
|
Swift iOS开发
Swift - 与OC混编时如何创建桥接头文件
Swift - 与OC混编时如何创建桥接头文件
483 0
Swift - 与OC混编时如何创建桥接头文件
|
Swift iOS开发
oc与swift混编
1.swift中调用oc;2.oc中调用swift
297 0
oc与swift混编
|
Swift
Swift和OC控制器互相跳转
Swift和OC控制器互相跳转
324 0
|
Swift iOS开发
Swift - 如何用Reachability来混编判断网络状况
Swift - 如何用Reachability来混编判断网络状况
305 0
|
Swift iOS开发 容器
iOS 仿支付宝银行卡界面(支持Swift/OC)
在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
392 0
|
Swift
OC 和 swift 创建单例方法
OC 和 swift 创建单例方法
331 0
|
Swift
OC与swift的数据传输
该项目主要介绍了oc与swift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知) 如果oc与swift之间的桥接有疑问请参考:OC与swift桥接互调
225 0
OC与swift的数据传输