oc与swift混编_swift与oc混编 - CSDN
精华内容
参与话题
  • OC与Swift混编

    千次阅读 2016-01-26 10:16:30
    Swift发展势头越来越好,而很多公司很难一下子从OC全部切换到swift,这个时候混编就显得那么的重要,本人也在逐渐的尝试混编然后逐步取代OC,从而全部转到swift上。 其实,从2014年swift刚出来的时候就开始研究swift...

    Swift发展势头越来越好,而很多公司很难一下子从OC全部切换到swift,这个时候混编就显得那么的重要,本人也在逐渐的尝试混编然后逐步取代OC,从而全部转到swift上。

    其实,从2014年swift刚出来的时候就开始研究swift的相关语法及定义了,但是由于公司很难转变,所以一直也没有运用到实践当中,这个时候就非常佩服那些小公司,或者应该叫初创公司,没有任何的烦恼,新开发的app都是运用swift。。。非常羡慕。。。

    好了,废话不多说,看看用法吧。。

    首先,我们有一个OC项目的工程,我这边叫MixDemo,这个时候需要新增一个swift的类,与添加OC类一样,只是选择的语言选择swift。


    由于我的工程是OC的工程,添加一个swift文件的时候,苹果会问开发者要不要添加一个bridge,我们需要添加这样一个桥接。


    这个时候我们会看到我们的工程里面多了一个MixDemo-Bridging-Header.h的文件

    我们在swift文件中添加一个方法,返回一个字符串:

    class Test4SwiftVC: NSObject {
        func f1() -> String {
            return "Test Mix"
        }
    }
    那么问题来了,如何在OC的.m文件中调用该方法呢?

    我们先看看工程文件里面的build Settings:

    看到红色标注出来的地方,默认是工程名称-Swift.h,我们自定义为SwiftModule-Swift.h,以方以后修改工程名称的时候出错。这个文件就是我们在OC类中调用swift类的引用头文件,这个类在工程中看不到,但是我们可以Command+点击查看这个类的内容:


    此时需要将工程Clean下,然后在OC的实现文件中,引用该头文件,即可调用swift中的类了:

    - (void)viewDidLoad {
        [super viewDidLoad];
        Test4SwiftVC *VC = [[Test4SwiftVC alloc] init];
        [VC f1];
        // Do any additional setup after loading the view, typically from a nib.
    }
    这样我们就可以在OC中调用swift中的f1方法了。


    那么在swift中怎么调用OC的方法或者变量呢?

    我们在ViewController中定义一个字符串:

    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    @property (strong, nonatomic) NSString *str;
    
    @end

    还记得我们一个的桥接文件么?似乎我们还没用到吧,这个时候就派上用场了。

    我们在MixDemo-Bridging-Header.h中添加OC的头文件:

    #import "ViewController.h"

    然后在swift文件中就可以引用啦。。。

    func f2() {
            var vc = ViewController()
            var str: String = vc.str
        }

    我们在swift中定义了第二个函数,定义一个变量vc去初始化ViewController这个类,然后定义一个String类型的变量来接收OC类中的参数,这样就可以互相调用啦,调用OC中的函数也是同样的道理,大家可以自己去研究。。。





    展开全文
  • iOS开发之OCSwift混编

    千次阅读 2018-08-17 17:53:26
    相信很多开发者在开发过程中,使用别人封装好的三方框架,但由于三方框架的开发语言(OC或者Swift现有工程的开发语言不一致,导致无法直接使用,那么对于混编来说,是不二的选择。 Swift项目使用OC框架   1...

    前言

    相信很多开发者在开发过程中,使用别人封装好的三方框架,但由于三方框架的开发语言(OC或者Swift)与现有工程的开发语言不一致,导致无法直接使用,那么对于混编来说,是不二的选择。

    Swift项目使用OC框架

     

    1. 建立桥接文件,一般的命名规则(项目名-Bridging-Header), 放在根目录Supporting Files文件下。

    桥接文件

    创建桥接文件时,必须把[targets打勾]。

    桥接文件

    2. 导入桥接文件路径,根据图片提供的步骤,将刚才建好的桥接文件直接拖入,会自动引用路径。 注意:拖进去的路径为本地项目的绝对路径,建议更改为相对路径($SRCROOT进行替换)。

    添加桥接文件路径

    3. 导入需要使用的OC框架的头文件 

    引用OC头文件

     

    展开全文
  • Swift与OC混编

    千次阅读 2019-04-19 16:56:37
    一、OC调用swift文件  在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,如下图:    点确定创建桥接文件,Xcode会自动创建一个桥接文件,其名字为:工程名-Bridging-Header.h ...

    一、OC调用Swift文件

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

    11

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

    12

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

    1、配置

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

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

    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
    15

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

    展开全文
  • ocswift混编

    2020-07-30 23:31:46
    这是需要做ocswift混编需要用到的,现在oc的发展变慢,swift成长很快,需要这种技术的请下载,如果不是做ios的请慎重
  • OC与swift混编

    千次阅读 2019-02-20 00:38:40
    相信很多iOS开发或多或少已经使用过swift,由于维护的项目时间比较久了,以往都是使用OC开发,现在正在对已有一些功能进行改版重写,索性使用swift来做,以下是在使用OC与swift进行混编过程的一些介绍。一、工程配置...

    前言

    苹果推出swift已经两年多了,到今年的九月份正式发布了swift的3.0版本,相信很多iOS开发或多或少已经使用过swift,由于维护的项目时间比较久了,以往都是使用OC开发,现在正在对已有一些功能进行改版重写,索性使用swift来做,以下是在使用OC与swift进行混编过程的一些介绍。

    一、工程配置

    1.Object-C bridging-header

    • Object-C bridging-header是什么?

    Object-C bridging-header是指OC与swift的桥接文件,它的作用是在swift文件中你可以使用OC文件中声明(和实现)的变量、常量、类、函数、方法等。

    • 怎么使用?

    我们现在拥有一个使用OC作为开发语言的iOS工程,在工程中只有OC相关的以.h或.m为后缀的文件。

    我们用Xcode8打开我们的iOS工程,然后在我们的iOS工程中创建第一个swift文件(command+n或者file->new->file)。

    此时会提示我们需要创建一个BridgingHeader文件。

    选择创建,打开bridgingHeader文件可以看到描述Use this file to import your target's public headers that you would like to expose to Swift.,很明显这个文件就是用来引入文件到swift的。

    想要在swift文件中使用OC文件,直接在这里引入你想导入的OC头文件就可以了,导入方式和OC文件的相互导入一样,如下:

     #import "OCClassFile.h"
    

    至此,在bridging-header文件中import相关OC头文件,就可以在swift文件中使用OC了。

    另外,假如你想给bridging-header文件重命名或者修改它的文件路径,你可以在build setting中进行修改配置,其中Swift Compiler General选项下的Object-C Bridging Header文件路径是相对路径,你可以新建一个文件夹或者给bridging-header文件重命名,只需要在这里更新一下新的文件路径就可以了。

    2. Swift.h

    • Swift.h是什么

    Swift.h文件是指Swift模块的头文件,类似于framework的头文件,它的作用是在OC文件中你可以使用swift中声明的变量、常量、类等。

    • 怎么用

    在完成1的步骤后,然后build一次iOS工程,就会自动生成swift.h文件,在任意OC文件中直接引入swift.h文件,就可以使用swift文件中的内容了:

    #import "ProjectName-Swift.h"
    此处注意,工程名中如果存在空格" "或者中划线"-",需要用下划线"_"代替。

    Swift.h文件是自动生成的,不需要手动创建,这个文件的内容也不需要手动管理,在每次build工程时都会被更新。其中只要在swift文件中使用public修饰的类(必须是继承自NSObject)和方法,都可以在OC中直接使用。

    二、混编遇到的问题

    • OC NSMutableArray 与 swift Array

    在Swift中使用OC类中的方法时,有些参数会是NSMutableArray的类型,Swift中创建的Array与其类型不一致,此时需要进行类型转换。

    如果直接进行类型转换,Swift编译器会直接报错Cannot convert value of type '[SwiftClass]' to expected argument type 'NSMutableArray'

    一个可行的办法是,先将Swift中的Array对象转换成NSArray,然后再讲NSArray转换成NSMutableArray。

    class TestSwift: NSObject {
    
        dynamic func test() -> Void {
            let swiftArray = [NSObject]()
            let array = swiftArray as NSArray
            self.change(array: array.mutableCopy() as! NSMutableArray)
        }
    
        dynamic func change(array: NSMutableArray) -> Void {
    
        }
    }
    
    • 字符串长度

    在OC中的NSString对象会有length属性来获取字符串长度,swift中可以用characters.count来代替。

    // Swift String
    let swiftStr = "abc"
    assert(swiftStr.characters.count > 0, "字符串长度不合法")
    
    // OC String
    let ocStr = NSString.init(string: "abc")
    assert(ocStr.length > 0, "字符串长度不合法")
    
    • 字符串子串
    // swift
    let swiftStr = "abc"
    let subStrIndex = swiftStr.index(swiftStr.endIndex, offsetBy: -1)
    let subStr = swiftStr.substring(to: subStrIndex)
    print(subStr)
    
    // OC
    let ocStr = NSString.init(string: "abc")
    let ocSubStr = ocStr.substring(to: 2)
    print(ocSubStr)
    
    
    • protocol命名

    在使用过程中遇到一个问题是,在OC中有一个代理方法命名是以大写字母开头的,导致在swift中实现代理方法时编译器一直报错,始终找不到问题,把协议方法名改为小写(一般的驼峰命名)后,编译器不在报错。

    展开全文
  • iOS开发中实现OCSwift混编

    千次阅读 2018-04-18 17:14:32
    原有的项目都是使用OC写的,既然要在原有项目中引入swift文件首先就要实现OCswift混编设置。 混编设置: 在OC项目中创建一个swift文件的时候首先Xcode会弹出一个提示框: 这时我们要选择“Create ...
  • ocswift混编(方法相互调用)

    千次阅读 2019-02-28 11:01:37
    OCSwift是苹果爸爸的原生语言,Swift代替OC的成本太高,需要过度和时间,但是现在的Swift的成长很快,在这个矛盾的时间,我们必须混编了。 1、创建一个新的工程 ,工程的名字叫OCAndSwiftDemo。 2、配置工程...
  • swift与OC混编(创建混编工程)

    千次阅读 2016-02-12 10:34:29
    就在15年WWDC上更是把Swift进行了开源,瞬间star就开始不断飙升,截止今天(16年1月25)已经达到26059个star【源码请点击这里】,而且每天还都在不断增长,而且每天都会有Pull Requests。这足以说明全球开发者对这门...
  • OC与swift混编(桥接)

    2018-10-10 14:49:59
    所谓桥接就是在OC 工程中第一次创建swift文件的时候回生成一个头文件(Bridging-Header.h 桥)。 这里主要是swift 调用OC方法的时候引入OC文件.h 所使用的   第一次在OC工程中创建swift文件生成的桥 头文件, ...
  • 1. swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部加上 @objc(代理...
  • swift与OC混编(方法调用)

    万次阅读 2016-02-12 10:35:31
    背景在上一篇文章中简单讲述了怎么创建SwiftOC混编工程。本篇讲一下SwiftOC混编工程中的方法调用。OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,...
  • OCSwift混编Pod引入第三方库的问题 问题描述:Swift应用OC 的开源框架,需要创建一个桥接头文件,问题就出在这个看似简单,却隐藏着一个巨大的问题:一切都按部就班的在桥接头文件中引入了OC 头文件,但是...
  • OCswift混编包太大

    千次阅读 2018-01-29 17:29:50
    OCswift混编包太大问题
  • OC与Swift混编后,感觉吊吊地,但某一天要发布应用时,心情就纠结了。本地AD hoc打包30.4M,发布应用到商店并且成功上线,发现APP体积为48.8M,心情非常惊讶。同事产品需求要把APP体积降到10M,一阵....。那么,APP...
  • swiftoc混编 找不到头文件等问题

    千次阅读 2018-05-03 10:42:49
    1 swift项目,找不到第三方文件,exp:AFN.h找不到,要修改build settings 里的User header custome search paths ,改成${SRCROOT},选择recursive.2 oc项目找不到swift文件,要引入工程名-swift.h文件。A.设置...
  • 关于OCSwift混编的基本使用

    千次阅读 2016-06-15 10:32:23
    概述 Swift的设计的初衷就是摆脱...随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文
  • Swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好...这里主要介绍swift类中调用OC方法和swift类中调用C函数以及OC类中调用swift的函数这三种类型的混编.
  •   在OC swift混编后打包由于SwiftSupport支持文件会导致混编后的打的包文件会偏大。 ####解决方法 Build Setting -&gt; User-Defined -&gt; EMBEDDED_CONTENT_CONTAINS_SWIFT 设置为NO #####相关链接 ...
  • OC代码中使用Swift文件的实践

    千次阅读 2018-05-31 11:32:11
    今天研究了一下如何在OC项目中使用swift文件,即OCswift混编问题,发现在OC中要使用swift文件也是蛮简单的,实践过程列如下: 1)首先随便创建了一个OC项目,就叫 DetialViewDemo 2)因为Swift的代码默认是...
  • Objective-C Swift 混编之路

    万次阅读 热门讨论 2015-09-20 11:15:50
    重要资料Using Swift with Cocoa and Objective-C 官方文档为什么要混编? 语言发展趋势(TIOBE),Swift 排行持续上升, OC 排行呈重力下降 项目正常迭代需要 很多第三方库仍然使用 OC 实现 项目中原来已经用 OC ...
1 2 3 4 5 ... 20
收藏数 1,639
精华内容 655
关键字:

oc与swift混编