swift与oc混编_oc与swift混编 - CSDN
精华内容
参与话题
  • 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

    展开全文
  • oc不能继承Swift类,所以向oc项目中添加的Swift类不能包含oc的子类。 Swift文件和.m不能重名。 继承oc的类的Swift类才能在oc中使用。 编译场景问题 用oc新建的iOS项目,在swift文件中默认使用release编译场景,如果...

    注意事项

    1. oc不能继承Swift类,所以向oc项目中添加的Swift类不能包含oc的子类。
    2. Swift文件和.m不能重名。
    3. 继承oc的类的Swift类才能在oc中使用。

    编译场景问题

    用oc新建的iOS项目,在swift文件中默认使用release编译场景,如果需要用到debug,需要在Build Settings-Swift Compiler-Active Compilation Conditions添加DEBUG或者在OTHER_SWIFT_FLAGS中添加-DDEBUG。也可以新增其他的编译场景。

    互相调用问题

    oc和Swift文件默认不能互相调用

    • Swift用oc的文件,在xxxx-Bridging-Header.h文件中引用oc头文件。在oc项目中创建第一个swift文件时会提示自动添加桥接文件,如果不小心选择了否,可以按这个命名自行添加,然后在Objective-C Bridging Header中配置正确的地址。
    • oc用Swift的文件,在相应.m中引用#import “xxxx-Swift.h”,其中xxxx是Build Settings中的Product Module Name。添加此文件后,可以使用Swift类,如果要使用其中的方法和属性,需要在相应方法和属性前添加@objc;或者在class声明前添加@objcMembers。
    • oc用Swift特有类型

    有些数据类型、语法、特性是Swift特有。
    比如Swift的枚举,oc不能识别
    这时要将类标记为@objc(Xxxx)

    Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C

    这时要在使用到Swift中枚举声明前添加@objc。
    而成员变量为字符串类型时,添加@objc也无法使用。

    oc迁移Swift

    1.属性和方法权限

    oc中a类要暴露给b类调用的方法和属性,放在.h中即可,在.m扩展和本类实现中的方法和属性则无法被a类调用。
    swift中的属性和方法默认的权限等级与oc不同,所以要分清权限关键字的区别,以更好地完成业务需要。

    • Internal。默认权限。在模块内部可以被其他文件或类使用,超出模块内部不可被访问。
    • private:其修饰的属性或者方法只允许在当前类所在源文件中调用,修饰的方法不可以被代码域之外的地方访问 ,包括子类和同文件里的其他类。本类源码文件的extension除外。
    • fileprivate:其修饰的属性或者方法只能在当前的 Swift 源文件里可以访问,即在同一个文件中,所有的 fileprivate 方法属性都是可以访问到的。
    • public:其修饰的属性或者方法可以在其他作用域被访问 但不能在重载 override 中被访问 也不能在继承方法中的 Extension 中被访问
    • open:open是为了弥补public语义上的不足。现在的pubic有两层含义:
      这个元素可以在其他作用域被访问
      这个元素可以在其他作用域被继承或者override

      而open意思是在其他module中只能被访问,不能被override
    • final:修饰方法不能被override,修饰类不能被继承。一般应用场景是:
    1. 类或者方法的功能确实已经完备了
    2. 避免子类继承和修改造成危险
    3. 为了让父类中某些代码一定会执行

    2.数据类型选择

    Swift的Struct是值类型,相比Class:
    优点:

    1. 安全性:Struct用值类型传递,没有引用计数;值类型是自动线程安全的
    2. 内存:不会因为循环引用导致内存泄露
    3. 速度:值类型通常以栈的形式分配,读写比Class快
      缺点:
    4. 混编时,oc中无法调用Swift的Struct
    5. 继承:Struct不能继承
    6. NSUserDefaults:Struct不能被序列化成NSData

    暂未解决的坑

    1. oc使用Swift特性的枚举
    2. Swift自动识别oc方法名重复

    持续更新

    参考文章

    https://blog.csdn.net/shubinniu/article/details/79239155
    https://www.jianshu.com/p/97225a04a4b4
    https://www.cnblogs.com/beckwang0912/p/8508299.html

    展开全文
  • 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中的函数也是同样的道理,大家可以自己去研究。。。





    展开全文
  • swift与OC混编(创建混编工程)

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

    原创文章转载请注明出处。

    背景


    Swift语言自推出以来苹果官方就开始努力开始推这门新语言。就在15年WWDC上更是把Swift进行了开源,瞬间star就开始不断飙升,截止今天(16年1月25)已经达到26059个star【源码请点击这里】,而且每天还都在不断增长,而且每天都会有Pull Requests。这足以说明全球开发者对这门语言的认可度。虽然现在在有些地方还不够完善,但是相信会在未来的某一天,Swift语言会成为一门主流开发语言。

    混合开发


    扯淡结束,进入正题。

    本文所使用的Xcode版本为7.1。

    之前大家都熟悉了很久的OC语言,也许也开始尝试写一些Swift,但是这两个语言怎么进行混编呢?下面就说一下。Swift和OC的混编没有做的C与OC那样高度融合。

    新建OC工程


    新建工程不再多说,相信大家都很熟悉了,这里我们先拿OC项目中引用Swift来进行说明。

    新建工程名为MixDemo,新建完工程以后可以不用进行任何修改和配置。我们先新建一个Swift类,新建方式与之前一样,只是在新建的时候注意选择语言为Swift。

    创建Swift文件

    新建Swift类名为SwiftDemo。点Create以后会出现这样一个弹出提示:

    创建桥接文件

    这是因为Swift和OC进行混编的时候需要一个中间的桥接文件。桥接文件中需要导入Swift类中引用到的OC类的头文件。

    点击Create Bridging Header,工程中会多出两个文件,一个是SwiftDemo.swift文件和桥接文件MixDemo-Bridging-Header.h。新建完以后工程结构如图:

    工程结构

    简单的方法调用


    OC调用Swift


    新建完成Swift类以后,我们来Build一下工程,perfect模拟器跑的很欢快,虽然什么代码也没有写。

    下面我们在SwiftDemo.swift文件里写点东西。代码如下:

    swift文件代码

    @objc(SwiftDemo)
    
    public class SwiftDemo : NSObject {
    
        public func logMe() {
            print("log me");
        }
    
    }
    

    这里注意一下:

    • 在Swift类中最好加@objc进行说明。因为如果不是继成自NSObject或NSObject的派生类,编译后将不会生成对应的转换类。在OC中也就找不到相应的声明,从而导致无法调用。

    • 类和方法要声明成public才能在OC中调用到。如果你已经看过Swift,相信你对这个应该不陌生。

    • 当你在Swift里添加一个public的类或者方法以后需要重新编译才会在OC端调用到。因为Swift需要重新编译转化为OC的“中间文件”,在“中间文件”中有了该类或者改方法OC才可以调用。关于这个“中间文件”下面会进行说明。

    现在我们回到ViewController.m文件里。在OC文件中如果想要调用Swift类的方法的话需要导入一个头文件。该头文件在工程中不可见,默认格式为xxx-Swift.h,其中xxx为项目名。对于我们这个项目来说,也就是MixDemo-Swift.h

    import该头文件以后我们就可以调用Swift的方法了。比如调用刚才我们写的SwiftDemo里面的logMe方法。上面提到修改Swift文件如果是public的话需要重新编译一下,好,那我们编译一下。perfect,还是没问题,继续。

    这时候你就可以写你很熟悉的OC代码了。我们在viewDidLoad里添加代码如下:

    SwiftDemo* demo = [[SwiftDemo alloc] init];
    [demo logMe];
    

    这时候你就会发现,当你写这段代码的时候,Xcode已经开始有提示了。是不是很神奇?

    下面我们来看一下这个神秘的MixDemo-Swift.h文件。按住command键然后点击鼠标左键,进入该文件。直接滑动到该文件的最下面,你就会发现一件很有意思的事情:Xcode的提示并不是直接读取的Swift,而是由于这个“中间文件”。这个中间文件里有我们刚写的SwiftDemo和logMe函数。

    中间文件代码

    思考:如果把objc括号里改成其他名称是否可以?修改以后再回到这个文件观察有什么变化。

    然后Build一下,你会在控制台上看到打印了”log me”,这说明OC调用了我们刚才写的Swift的LogMe函数。

    Swift调用OC


    Swift调用OC的时候需要在MixDemo-Bridging-Header.h文件中导入Swift会引用到的CO类的头文件。

    首先我们在ViewController.h头文件中声明一个函数:

    - (void) logYou;
    

    然后在实现文件中简单些一下实现:

    - (void)logYou {
        NSLog(@"log you");
    }
    

    然后我们在MixDemo-Bridging-Header.h文件中#import “ViewController.h”文件,command+s保存一下当前的编辑。

    然后回到SwiftDemo.swift文件中,在LogMe函数里我们调用一下OC的logYou。

    所以我们现在的逻辑是在OC的viewDidLoad中实例化SwiftDemo然后调用logMe,然后在SwiftDemo里的logMe里面实例化ViewController然后调用它的logYou。logMe代码如下:

    public func logMe() {
        print("log me");
    
        let vc = ViewController()
        vc.logYou()
    }
    

    然后再跑一下工程。两句话都打印了,很好。

    但是,这个MixDemo-Bridging-Header.h文件到底是个什么呢?

    工程相关配置


    点击工程target然后点击Build Settings,然后在搜索框里输入swift,就会出现和Swift相关的配置信息,如图:

    修改工程配置

    你会在Object-C Bridging Header项后面发现一个熟悉的文件MixDemo-Bridging-Header.h。这个就是配置这个“中间文件”的地方。所以,现在你知道了这个文件配置的位置,以后你就可以自己任意修改成你喜欢的文件名字了,记得修改时文件路径问题,还有记得工程中要有与之对应的文件。

    此外,一般情况下还需要注意修改的配置信息为:

    结语


    本文Demo可以在【这里】下载到

    创建OC和Swift混编工程就说到这里。后面会说一下Swift怎么调用OC的类方法(静态方法)以及变参方法点击这里查看文章内容

    —End—

    展开全文
  • Swift SwiftOC混编

    千次阅读 2016-05-02 16:33:20
    难得的五一小长假,就有空简单的谢谢SwiftOC的混合编程的Demo。1.新建一个空的Swift项目 注意语言选择Swift。2.新建一个OC的控制器 注意语言选择OC。3.这一步很重要 一定要点击红框中的按钮。4.设置桥接文件...
  • SwiftOC混编

    2020-07-30 23:30:03
    SwiftOC混编,OC项目下Swift和OC的互相调用,Swift项目下Swift和OC的相互调用!
  • Swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好...这里主要介绍swift类中调用OC方法和swift类中调用C函数以及OC类中调用swift的函数这三种类型的混编.
  • iOS开发中实现OCSwift混编

    千次阅读 2018-04-18 17:14:32
    原有的项目都是使用OC写的,既然要在原有项目中引入swift文件首先就要实现OCswift混编设置。 混编设置: 在OC项目中创建一个swift文件的时候首先Xcode会弹出一个提示框: 这时我们要选择“Create ...
  • 在进行swift编程的时候,有时候难免要进行Objective-c的混编(如引入OC语言的第三方库),本文主要讲述swift与OC混编的两种方法。 一.比较方便直接的方法 1.直接在创建好的swift工程中任意新建一个OC的类,我们会...
  • swift与OC混编(方法调用)

    万次阅读 2016-02-12 10:35:31
    OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(你的项目配置相关,具体配置方式见上一篇文章) 2.OC类里仅可以调用public的Swift...
  • swift混编oc 在桥接头文件里#import oc的.h文件,整个swift工程都能使用该oc文件,在.h里暴露的方法都能被该工程使用 //oc文件 TestOC.h #import @interface TestOC : NSObject - (void)sayHello; ...
  • OC Swift 混编

    2017-08-30 13:29:01
    首先承认我落后了,到今天才开始在项目里用swift,而且还不是全部的用,只是ocswift混编,因为实在是进入项目的时候框架已经用oc搭好了啊啊啊啊啊。只能退而求其次,混编了,大致根据百度到的方法试了一下,不是很...
  • ocswift混编

    2020-07-30 23:31:46
    这是需要做ocswift混编需要用到的,现在oc的发展变慢,swift成长很快,需要这种技术的请下载,如果不是做ios的请慎重
  • OC与Swift混编后,感觉吊吊地,但某一天要发布应用时,心情就纠结了。本地AD hoc打包30.4M,发布应用到商店并且成功上线,发现APP体积为48.8M,心情非常惊讶。同事产品需求要把APP体积降到10M,一阵....。那么,APP...
  • Swift与OC混编

    2019-09-22 06:46:34
    OC调用Swift的方法:添加 import "xxxx-Swift.h" 头文件即可 Swift调用OC的方法:需要建立桥接: xxxx-Bridging-Header.h 头文件(建立方法自行百度) 注意: 1.在Swift调用OC的单例方法时,直接xxxx(),()里面可以有参...
  • 1. swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部加上 @objc(代理...
  • swift oc混编 打包framwork

    千次阅读 2017-05-06 18:47:20
    最近由于项目需求需要使用Swift做开发,但之前的好多有用的东西都是使用OC写的,鉴于这种情况最好的方式当然是使用swift重写,但这样的工作量太大,而且不能保证功能的稳定性,所以自己就尝试的使用Framework来嵌入...
  • IOS --- OC与Swift混编

    2016-03-18 09:30:02
    原文地址:--- OC与Swift混编">IOS --- OC与Swift混编作者:烟雨秋心群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看...
  • OCSwift混编Pod引入第三方库的问题 问题描述:Swift应用OC 的开源框架,需要创建一个桥接头文件,问题就出在这个看似简单,却隐藏着一个巨大的问题:一切都按部就班的在桥接头文件中引入了OC 头文件,但是...
  • Swift与OC 混编

    2015-11-30 10:26:18
    Swift与OC混编Swift中调用OC 在OC中调用Swift
1 2 3 4 5 ... 20
收藏数 1,683
精华内容 673
关键字:

swift与oc混编