精华内容
下载资源
问答
  • oc和swift混编

    2019-02-27 20:45:40
    这是需要做oc和swift混编需要用到的,现在oc的发展变慢,swift成长很快,需要这种技术的请下载,如果不是做ios的请慎重
  • OC和Swift混编

    2017-04-23 17:40:54
    一、OC项目里面使用Swift文件 1、在OC项目里面添加一个swift类 ...这是因为Swift和OC进行混编的时候需要一个中间的桥接文件,桥接文件中需要导入OC类的头文件。 如果你点击“Create Bridging Heade

    一、OC项目里面使用Swift文件

    1、在OC项目里面添加一个swift类

    创建一个swift类,Language选择swift,点击next,这是Xcode会提示如下图所示:


    pic-1.png

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

    如果你点击“Create Bridging Header”按钮,就会生成你需要的swift文件(我这里是SwiftClass.swift文件)和已经有默认名字的桥接文件。系统默认的格式是"项目名-Bridging-Header.h"。当然你也可以自己手动配置桥接文件。

    2、 手动配置桥接文件

    • 创建一个Head File文件,比如: Bridging-Header.h

    pic-3.png
    • 找到targets->build settings ->Ojective-C Bridging Header,配置路径

    pic-2.png
    • 路径一般就是项目名/桥接文件名称,当然了路径层次具体看文件层级

    3、头文件

    在OC文件中如果想要调用Swift类的方法的话需要导入一个头文件。该头文件在工程中不可见,默认格式为xxx-Swift.h,其中xxx为项目名。当然了如果你的项目名字里面有汉字得话可以自己配置头文件名称。

    选中targets->build settings ->packing->Product Module Name 中设置模块名,如下图所示 


    pic-4.png

    那么这时候只需要在OC项目里需要swift文件的地方导入:

    #import "Lucky-Swift.h"

    使用举例:我在SwiftClass.swift文件里实现一个方法:

     func returnSwiftName() ->String{
       // let vc = ViewController()
        //vc.getOneMethodForSwift()
        return "欢迎使用swift语言!!!"
    }

    在控制器里使用:

    /**
     *  OC里面调用swift方法
     */
    - (void)useSwiftMethod{
      SwiftClass * wigt = [[SwiftClass alloc] init];
      NSLog(@"%@",wigt.returnSwiftName);
    }

    如果想在SwiftClass.swift文件里面调用控制器声明的方法,只需在桥接文件中导入,下面的ViewController是相对的,看具体的名称:

    #import "ViewController.h"

    在SwiftClass.swift文件里:

     func useVCMethod() {
        let vc = ViewController()
        // getOneMethodForSwift是在控制器.h声明和.m实现的方法
        vc.getOneMethodForSwift()
    }

    关于OC里使用swift的更多知识,请参考下面这篇文章;
    原文地址

    二、swift项目里使用OC文件

    和上面的使用细节大差不差……

    • 创建OC文件
    • 生成桥接文件/配置桥接文件路径
    • 在桥接文件里导入OC文件
      OK,可以使用了

    注意:当Xcode没有智能提醒,敲不出方法时的,"Command+B"编译一下,再试试~~


    展开全文
  • OC和swift混编Framework

    2020-12-22 13:37:56
    OC和swift混编Framework1. 创建framework2. OC和swift的互想调用2.1 swift调用OC2.2 OC中调用swift文件2.3 合并framework 1. 创建framework 首先我创建一个project,然后选择framework,选择OC语言,如下图: ...

    1. 创建framework

    • 首先我创建一个project,然后选择framework,选择OC语言,如下图:在这里插入图片描述

    • 然后再创建一个swift的class文件,最终目录结构如下:在这里插入图片描述

    • framework中混编没有桥接文件,创建framework时,会自动生成一个xxx.h文件(如上:SwiftOCFramework.h),这个文件的作用和项目中混编的桥接文件作用类似

    • Build Setting ----> Build Active Architecture Only 需要设置为NO,表示编译出来的静态库支持所有的设备,如果为YES,则只支持当前编译设备

    • 最终选择真机和模拟器编译 即可得到framework,可以点击Products下framework,如果是没有编译的则是红色,编译过,则可以右击,寻找到framework的位置

    2. OC和swift的互想调用

    2.1 swift调用OC

    • 首先我们在swift文件中增加方法来调用OC类中的方法
    //该方法内部直接调用OC中的方法
    public func swiftToOC() {
            print("-------------")
            let OCtest = TestOCFile()
            OCtest.ocTest()
            TestOCFile.swiftTest()
        }
    
    • 注意:
      • swift中的方法,如果是有关键字public修饰,则可以在framework外面访问,如果没有用此关键字修饰的,则无法调用
      • swift文件中调用OC的类,跟其项目中混编类似,需要再头文件(xxx.h)中导入需要调用OC的.文件
      • xxx.h头文件想要导入OC的.h文件,首先xxx.h文件必须在public中,并且OC的这个.h文件也必须处于public,不然报错找不到该文件
      • Build Phases —> Header , 如果该头文件不在public中,需要把头文件放到public中,直接拖拽即可:在这里插入图片描述

    2.2 OC中调用swift文件

    - (void)ocToswift {
        TestSwift *test = [[TestSwift alloc] init];
        [test OCCallBackSwift];
    }
    
    public class TestSwift: NSObject {
        @objc public func OCCallBackSwift() {
            print("OCCallBackSwift")
        }
    }
    
    • 注意:
      • OC调用swift,需要导入swift的头文件,例如:#import <SwiftOCFramework/SwiftOCFramework-Swift.h>
      • swift的class 必须要被public关键字修饰
      • swift中的method必须要被@objcpublic两个关键字更新,@objc:给OC调用的方法必须加上次关键字,public是表示公开暴露的方法

    2.3 合并framework

    • 选择真机和模拟器编译之后,我们右击找到framework的所在地:在这里插入图片描述

    • 首先我们可以通过终端输入指令: lipo -info framework的地址来查看两个framework支持的架构信息:在这里插入图片描述
      同样的我们通过此方式查看真机的架构:在这里插入图片描述

    • 合并两个真机库和模拟器库,我这里直接把模拟器的framework合并到真机里面,合并之后查看合并的framework的架构信息,使用命令lipo -create 真机framework地址 模拟器framework地址 -output 输出文件路径在这里插入图片描述

    • 合并完库之后发现只能在真机上运行,无法在模拟器上运行,这是因为我们只是合并了库,但是没有合并SwiftOCFramework.swiftmodule里面的文件,现在只需要把模拟器中的文件直接拷贝到你合并的framework的对应文件中,然后再导入framework运行即可

    • 合并完库之后,直接把framework拖入到项目中,导入头文件,既可以直接使用了。

    展开全文
  • oc swift 混编

    2015-04-07 18:37:11
    作者:fengsh998 ... 转载请注明出处 ...如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢!...swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某

    作者:fengsh998
    原文地址:http://blog.csdn.net/fengsh998/article/details/34440159
    转载请注明出处
    如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢!


    swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编。这个在IOS8中是允许的。

    先中简单的入手,先研究在同一个工程目录下混合使用的情况。

    为了演示。先准备两个类

    第一个是swift语言写的类,文件名为 act.swift

    1. import Foundation  
    2.   
    3. class Act : NSObject  
    4. {  
    5.     func hasAct(tag:Int) -> String  
    6.     {  
    7.         switch (tag)  
    8.         {  
    9.         case 1:return "Movie"  
    10.         case 2:return "CCTV"  
    11.         case 3:return "Sport TV"  
    12.         default:return "Area TV"  
    13.         }  
    14.     }  
    15.       
    16.     init()  
    17.     {  
    18.         println("act constructor is called.")  
    19.     }  
    20.       
    21.     deinit  
    22.     {  
    23.         println("act destroyed is called.")  
    24.     }  
    25. }  

    第二个是用OC写的类 头文件为OCChannel.h ,实现文件为OCChannel.m

    头文件

    1. #import <Foundation/Foundation.h>  
    2.   
    3. @interface OCChannel : NSObject  
    4.   
    5. @property (nonatomic,retain) NSString *ChannelName;  
    6.   
    7. - (NSString *)ChannelChange:(NSInteger) channels;  
    8.   
    9. @end  

    实现文件

    1. #import "OCChannel.h"  
    2. #import "SwiftModule-swift.h"  
    3.   
    4. @interface OCChannel()  
    5. {  
    6.     Act     *act;  //swift的类  
    7. }  
    8. @end  
    9.   
    10. @implementation OCChannel  
    11.   
    12. - (id)init  
    13. {  
    14.     if (self = [super init]) {  
    15.         NSLog(@"OC Constructor is called.");  
    16.         //使用Swift类  
    17.         act = [[Act alloc]init];  
    18.     }  
    19.     return self;  
    20. }  
    21.   
    22. - (void)dealloc  
    23. {  
    24.     NSLog(@"OC Destroyed is called.");  
    25.     //[act release];//ARC not use  
    26.     //[super dealloc];//ARC not use  
    27. }  
    28.   
    29. - (NSString *)ChannelChange:(NSInteger) channels  
    30. {  
    31.     return [act hasAct:channels];  
    32. }  
    33.   
    34. @end  

    这个OCChannel为中引用了swift 写的类Act 。主要是为了演示在同一个工程项目里,swift类调用OC,同时OC类也调用Swift。从而形成一种混合编写的模式。


    下面是具体步骤:

    1.新建一个Swift工程:我这里工程名为MixDemo


    建好后工程:


    2.就是分别引入前面的两个类,咱先一个个来。因为建的是Swift,所以,咱先以Swift工程中引用OC文件进行一次混编

    Swift中使用OC

    首先Swift中不再使用头文件和.m文件的方式了。所以也不需要使用import ""来导入头文件。哪swift 如何能访问到OC的类声明的。

    其实,swift也是需要使用头文件进行访问的,只不过不再需要使用显式的方式使用import进行导入。有两种方式来实现这个头文件的生成。

    方式一:在一个全新的Swift,利用第一次新建提示的方式自动添加桥接头文件。




    点确定这后就会生成一个以<produceName-Bridging-Header.h>的头文件。

    建好后的工程:


    这里有一个地方需要注意的就是在targets->build settings ->Object-C Bridging Header 设为哪个桥接的头文件即可。



    经过上述步骤,桥接文件弄好了就可以

    尽情的把想要在swift类中调用的OC头文件放使用import "" 写到这个桥接文件中吧。就像:

    1. //  
    2. //  Use this file to import your target's public headers that you would like to expose to Swift.  
    3. //MixDemo/MixDemo-Bridging-Header.h  
    4.   
    5. #import "OCChannel.h"  

    同样的,当你知道这个swift搜索头文件的关系后,就不需要再理会这个-Bridging-Header.h的文件了。完全可以手工建一个并取自己喜欢的名字。如:

    方式二:

    新建一个头文件,名为:OCContainerHeader.h



    好了,以上的设置后就完全满足了Swift使用OC写的类了。

    1. import UIKit  
    2.   
    3. class ViewController: UIViewController {  
    4.                               
    5.     override func viewDidLoad() {  
    6.         super.viewDidLoad()  
    7.         // Do any additional setup after loading the view, typically from a nib.  
    8.   
    9.         //调用OC类  
    10.         var channel = OCChannel()  
    11.         println(channel.ChannelChange(10))  
    12.         println(channel.ChannelChange(2))  
    13.     }  
    14.   
    15.     override func didReceiveMemoryWarning() {  
    16.         super.didReceiveMemoryWarning()  
    17.         // Dispose of any resources that can be recreated.  
    18.     }  
    19.   
    20.   
    21. }  

    好了下面再来看一下OC如何调用Swift写的类。(事实上,如果你是一比一抄我这个DEMO,哪么恭喜你,在以上你将编译不通过。因为我的OC类中引用了swfit 写的类,所以你要想运行,就必须把哪个Act 的类注释了才行。)


    OC如何调用Swift写的类

    OC要想使用,必须有头文件。而swift文件却没有头文件,所在咱们想必也需要产生一个头文件。但对于OC调用swift  的头文件比较特殊。因头文件里面的机制是自动生成的,在不熟悉的,不建议手写。

    哪如何产生这个头文件。(注意,系统设置的头文件,在工程中是看不到的。)

    产生步骤:

    选中targets->build settings ->packing->Product Module Name 中设置模块名,这个名称很重要 swift 的头文件就是根据这个来命名的。



    虽然你看图中有这个import "SwiftModule-swift.h"但你在整个工程中是找不到这个文件的,但可以使用CMD+ 鼠标点击可看这个头文件中的内容。



    这样,工程中如查Swift要使用OC,则把需要使用的OC类的头文件,全写在MixDemo-Bridging-Header.h里。同样如果OC中所使用的swift类,只需要Clean一把,再编就可以了,但不要忘了导入SwiftModule-swift.h哦(名称自取,但-swift.h是固定的),另外还有一个需要读者注意的。

    注:

    凡是用Swift写的类,如果不继成自NSObject或NSObject 的派生类,哪么编译后将不会生成对应的转换类。从而使得OC 中找不到相应的声明。

    如我的例子中 class Act 这样不会被编译到SwiftModule-swift.h中,但写为 class Act : NSObject,就可以编译出相应的声明。另外可以使用@objc加以声明,但这个还是一样,类最好继承NSObject下来。就像下面:

    1. import Foundation  
    2.   
    3. @objc(Act)  
    4.   
    5. class Act   
    6. {  
    7.     func hasAct(tag:Int) -> String  
    8.     {  
    9.         switch (tag)  
    10.         {  
    11.         case 1:return "Movie"  
    12.         case 2:return "CCTV"  
    13.         case 3:return "Sport TV"  
    14.         default:return "Area TV"  
    15.         }  
    16.     }  
    17.   
    18.     @objc(init)//原本以为加上这个alloc就可以找到,但不行的。。。  
    19.     init()  
    20.     {  
    21.         println("act constructor is called.")  
    22.     }  
    23.       
    24.     deinit  
    25.     {  
    26.         println("act destroyed is called.")  
    27.     }  
    28. }  

    但是在使用时你就会发现

            act = [[Act alloc]init]; //报错,找不到alloc,因此建议大家还是继承NSObject.



    好吧,今天就写到这里,再研究一下framework之间的混编。。。。。


    展开全文
  • OC和Swift混编.pdf

    2020-05-06 17:03:05
    OC混编Swift, Swift项目混编Objective-C Framework Target混编Swift 怎么遵循 OC运行时 混编的一些坑
  • OC和Swift混编相互调用

    2020-11-25 12:39:30
    现在咱们就一起学习下 OC和Swift混编,如何实现呢? 首先创建一个OC项目 这里不在做详细解释,直接进入 打开项目; 一 、添加swift 文件 (只要是混编 无论是在oc项目中添加swift文件 ,还是swift项目中添加oc文件) ...

    现在咱们就一起学习下 OC和Swift混编,如何实现呢?
    首先创建一个OC项目 这里不在做详细解释,直接进入 打开项目;
    一 、添加swift 文件 (只要是混编 无论是在oc项目中添加swift文件 ,还是swift项目中添加oc文件) 会提示添加一个桥文件 名字为oc_swift-Bridging-Header.h下面都用这个名字(如图)
    在这里插入图片描述
    这个时候 我们只需要点击确定即可; 这个桥文件是用来添加 swift使用oc的时候导入头文件使用的

    扩充 — 这个文件oc_swift-Bridging-Header.h 也可以手动添加桥文件 操作步骤
    首先
    在这里插入图片描述
    第二步 点击Build Settring -》 输入 Bridging Header 然后拖入你创建的.h文件即可(下面咱们只看自动创建的)
    在这里插入图片描述
    二 、swift 引用OC 例如 在创建的bgView.Swift 中创建ViewController实例
    在这里插入图片描述

    1、在oc_swift-Bridging-Header.h中导入#import “ViewController.h”
    如图
    在这里插入图片描述
    2、具体调用 如图
    在这里插入图片描述
    OK swift 调用OC 就完成了

    三 、OC 引用 swift
    1、首先设置 BUilding Setting 输入 Packaging 找到Product Module Name 如图
    在这里插入图片描述
    2 、在Product Module Name 输入项目名称 如$(TARGET_NAME) 如图
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201125114246400.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L
    3、进入ViewController文件
    导入 #import “oc_swift-Swift.h” 如图

    在这里插入图片描述
    OK 完成

    demo 实例

    展开全文
  • OC和swift混编包太大

    千次阅读 2018-01-29 17:29:59
    OC和swift混编包太大问题
  • IOS开发过程中OC和swift混编 在IOS开发过程中,由于OC和swift都有一定的用户,所以往往就会涉及到两种语言互相调用的这种情况,下面就来简单介绍一下使用的方法 swift中使用OC文件,这种情况存在与大多数情况就是在...
  • iOS UMeng OC和Swift混编

    2018-03-27 14:21:48
    iOS UMeng OC和Swift混编Swift调用Objective-C需要建立一个桥接头文件进行交互新建桥接头文件本例桥接文件命名为:UMengDemo-Bridging-Header.h设置Objective-C桥接文件导入SDK头文件在UMengDemo-Bridging-Header.h...
  • OC和Swift混编(惊喜!)

    2015-05-12 20:30:00
    今天在和一位前辈交流的之后,使用了OC和Swift混编开发,遇到了一个让我忍不住要欢呼的情况,在这里,跟大家分享一下,也再次赞叹一下XCode的强大. OC和Swift混编出现最多的就是在编写Swift代码的过程中使用OC框架了. ...
  • OC和Swift混编的时候,如果我们创建的工程是OC的工程是可以调用Swift中的exrension 分类的,但如果我们创建的工程是Swift工程就是,OC是无法调用Swift中的分类的,今天正好碰到了。记录下
  • iOS OC和Swift混编 1、创建一个swift或者oc的工程:我这里是创建的Swift语言的工程,工程名SwiftTest 2、在工程中代码目录下创建一个oc的类,选择oc语言, 会出一个对话框,选择YES3、这时会在工程里看到...
  • OC和Swift混编 a. Swift 和 OC 的映射关系 Swift 兼容来大部分 OC,当然还有一些 Swift 不能够使用的,例如 OC 中的预处理指令,即宏定义不可使用,虽然在目前4.2版本下,已经开始支持了少量的宏,如 #if ...
  • WWDC推出了SwiftUI、Combine,仅Swift可用~为了能顺利的也吃上SwiftUI,我也打算将自己的项目先从OC慢慢迁移到Swift,所以~一起从混编开始! 创建Swift的view 正常创建文件,语言选swift 创建Bridging Header 上...
  • 之前的一段时间在学习swift,觉得可以出师了,哈哈哈,遂打算把oc 和swift混编起来,混起来才发现远远比想象的要复杂。当然在这个过程中,自己也学到了不少知识,享受到了不少乐趣,简记下来,也算是对自己的一个...
  • OC和Swift混编Pod引入第三方库的问题 问题描述:Swift应用OC 的开源框架,需要创建一个桥接头文件,问题就出在这个看似简单,却隐藏着一个巨大的问题:一切都按部就班的在桥接头文件中引入了OC 头文件,但是...
  • OC和Swift混编小知识

    2020-04-09 17:32:19
    1:oc项目引用swift oc通过xxx-Swift.h调用swiftswift通过xxx-Bridging-Header.h调用oc。创建oc项目,xcode不会自动创建桥接文件。需要先创建xxx-Bridging-Header.h,才会生成xxx-swift.h文件。 2:swift项目...
  • oc和swift混编关键

    2015-07-09 17:41:00
     swift和oc混编连接点,必不可少。swift工程或oc工程添加ocswift时,Xcode提醒,建议手动添加。  注意引入文件后Xcode的target->build settings自动添加Swift Compiler * 项,Objective-c Bridging Header项...
  • OC和Swift混编开发配置

    2019-08-12 11:31:29
    Swift项目 中的OC类不能调用Swift文件的问题、通过如下文章解决了。https://www.jianshu.com/p/754396e7e1bd 但是OC不能调用没有继承于NSObject的Swift文件中定义的常量方法、 ...
  • OC和Swift混编经验

    2018-09-10 11:11:10
    Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OSiOS平台,用于搭建基于苹果平台的应用程序。 2015年12月4日,苹果公司宣布其Swift编程语言现在开放源代码。 Swift ...
  • swift文件访问oc文件 #oc文件访问swift文件 法一: 法二: 转载于:https://juejin.im/post/5b96366df265da0ac849186e
  • 关于OC和Swift混编

    2016-05-13 13:37:46
    oc中写Swift可以用的代码
  • iOS开发之OC Swift混编

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

    千次阅读 2019-02-27 20:49:18
    OC和Swift是苹果爸爸的原生语言,Swift代替OC的成本太高,需要过度和时间,但是现在的Swift的成长很快,在这个矛盾的时间,我们必须混编了。 1、创建一个新的工程 ,工程的名字叫OCAndSwiftDemo。 2、配置工程...
  • 现在写swift,很多的类库还不是很全,很多的第三方还是只有OC版的,这个时候swift想用,通常都是采用的swift和OC混编的方式.这里给大家演示一下混编是如何做的. swift中使用OCOC中,如果我们要使用某个类,我们...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 305
精华内容 122
关键字:

oc和swift混编