• 下载,解压缩,打开YourApplication
  • 就在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—

    展开全文
  • swiftOC进行混合编码。

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


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

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

    为了演示。先准备两个类

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

    import Foundation
    
    class Act : NSObject
    {
        func hasAct(tag:Int) -> String
        {
            switch (tag)
            {
            case 1:return "Movie"
            case 2:return "CCTV"
            case 3:return "Sport TV"
            default:return "Area TV"
            }
        }
        
        init()
        {
            println("act constructor is called.")
        }
        
        deinit
        {
            println("act destroyed is called.")
        }
    }

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

    头文件

    #import <Foundation/Foundation.h>
    
    @interface OCChannel : NSObject
    
    @property (nonatomic,retain) NSString *ChannelName;
    
    - (NSString *)ChannelChange:(NSInteger) channels;
    
    @end
    

    实现文件

    #import "OCChannel.h"
    #import "SwiftModule-swift.h"
    
    @interface OCChannel()
    {
        Act     *act;  //swift的类
    }
    @end
    
    @implementation OCChannel
    
    - (id)init
    {
        if (self = [super init]) {
            NSLog(@"OC Constructor is called.");
            //使用Swift类
            act = [[Act alloc]init];
        }
        return self;
    }
    
    - (void)dealloc
    {
        NSLog(@"OC Destroyed is called.");
        //[act release];//ARC not use
        //[super dealloc];//ARC not use
    }
    
    - (NSString *)ChannelChange:(NSInteger) channels
    {
        return [act hasAct:channels];
    }
    
    @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 "" 写到这个桥接文件中吧。就像:

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

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

    方式二:

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



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

    import UIKit
    
    class ViewController: UIViewController {
                                
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            //调用OC类
            var channel = OCChannel()
            println(channel.ChannelChange(10))
            println(channel.ChannelChange(2))
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
    }

    好了下面再来看一下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下来。就像下面:

    import Foundation
    
    @objc(Act)
    
    class Act 
    {
        func hasAct(tag:Int) -> String
        {
            switch (tag)
            {
            case 1:return "Movie"
            case 2:return "CCTV"
            case 3:return "Sport TV"
            default:return "Area TV"
            }
        }
    
        @objc(init)//原本以为加上这个alloc就可以找到,但不行的。。。
        init()
        {
            println("act constructor is called.")
        }
        
        deinit
        {
            println("act destroyed is called.")
        }
    }

    但是在使用时你就会发现

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



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




    展开全文
  • OCSwift混编

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





    展开全文
  • 原有的项目都是使用OC写的,既然要在原有项目中引入swift文件首先就要实现OCswift混编设置。 混编设置: 在OC项目中创建一个swift文件的时候首先Xcode会弹出一个提示框: 这时我们要选择“Create ...

    背景:

    最近又开始看了一些关于Swift的视频、博客、书,发现swift相对于OC使用起来更简洁了,于是就想在原有项目中引入swift。原有的项目都是使用OC写的,既然要在原有项目中引入swift文件首先就要实现OC和swift的混编设置。

    混编设置:

    1. 在OC项目中创建一个swift文件的时候首先Xcode会弹出一个提示框:

    这里写图片描述

    这时我们要选择“Create Bridging Header”,这样就会在项目中生成一个进行OC和swift桥接的.h文件文件和我们要创建的一个swift文件。

    1. 将“Build Setting”中的“Defines Module”设置为“Yes”。

    这里写图片描述

    设置Defines Module
    3. 在项目中创建一个.h文件,文件名:“项目名称-Swift.h”,如:OCAndSwift-Swift.h,创建完成之后我们在需要引入swift文件的OC文件中引入这个.h文件,然后在工程中将此.h文件删除,command + shift + K 即“clean”一下,项目便不会报错了。

    1. 创建一个swift文件,在要使用该swift文件的OC文件中直接使用该swift文件即可,都不用引入此swift文件。如果在OC文件中无法使用此swift类,我们只需command + shift + R一下即可。

    下面附上一个小demo的地址:https://gitee.com/liangsenliangsen/oc_and_swift_mixed.git

    本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。

    展开全文
  • OCSwift混编的三种情况: 1、OC工程中写入Swift文件并随手创建桥接文件 2、Swift工程中写入OC文件并随手创建桥接文件 3、混编时舍弃创建桥接文件,手动再创建一遍的方法
  • 概述 Swift的设计的初衷就是摆脱...随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文

    概述

    Swift的设计的初衷就是摆脱ObjC沉重的历史包袱,毕竟ObjC的历史太过悠久,相比于很多现代化语言它缺少一些很酷的语法特性,而且ObjC的语法和其他语言相比差别很大。随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文首先介绍下Swift与Objective-C混编的基本使用。

    Objc与Swift的渊源

    通过对swift的了解,大家不难发现Swift和ObjC必然存在着一定的映射关系,例如对于文件的操作使用了字符串的writeToFile方法,在网络请求时使用的NSURLSession,虽然调用方式不同但是其参数完全和做ObjC开发时调用方式一致。原因就是Swift编译器自动做了映射,如下图:(PS:借来的图)

    这里写图片描述

    Objc和Swift的相互调用

    切入正题,当我们使用OC和Swift在工程中进行混编的时候,通俗来说其实Objc文件和swift文件之间的相互调用。不管你的项目是基于Swift还是基于Objc的,无论是Swift中调用ObjC,还是ObjC中调用Swift都是通过头文件暴漏对应接口的,下图说明了这种交互方式:

    这里写图片描述


    • Swift调用Objc

    下面我们先建个Objc的工程,在Objc工程中新建Swift文件时,(或者在Swift工程新建Objc文件),Xcode会自动提示你是否创建bridging header桥接头文件,点击创建后Xcode会自动为你创建一个桥接头文件。Xcode会自动创建一个名为OC_Swift-Bridging-Header.h桥接头文件如图下图:

    这里写图片描述

    当然你也可以在Building Settings中自己设置桥接头文件,如下图:

    这里写图片描述

    创建好OC_Swift-Bridging-Header.h文件后,在OC_Swift-Bridging-Header.h文件中即可import需要提供给Swift的Objective-C头文件,Swift即可调用对应的Objective-C文件。同时Xcode可以自动生成Objective-C对应的Swift接口。

    ( PS:Objective-C类、协议、属性、方法、扩展、闭包等所有功能都可以无缝地被转换为Swift接口被Swift文件所调用。)


    • Objc调用Swift

    Xcode会自动为Project生成头文件以便在Objective-C中调用。在Objective-C类中调用Swift,只需要#import “productModuleName-Swift.h”即可调用,Xcode提供的头文件以Swift代码的模块名加上-Swift.h为命名。
    (PS:我这有个通俗的理解方式,不喜勿喷,可能不专业,但是好理解。。 “productModuleName-Swift.h文件可以理解为:这个是Objective-C调用Swift的,你写的swift文件在这个文件里对外提供了OC使用的接口,OC调swift,引入这个文件,相当于直接可以使用对外接口了,你可以通俗理解 平常OC的.h文件留的接口)
    在这个头文件中,将包含Swift提供给Objective-C的所有接口、Appdelegate及自动生成的一些宏定义。

    在大部分情况下,Objective-C都可以无缝地调用Swift,但是由于Swift相对于Objective-C多了一些新特性,比如泛型、元组、枚举的等,所以Swift暴漏给Objective-C的接口多了一些限制,因此Swift只能暴露在Objective-C中有效的接口。

    展开全文
  • OCswift3.1混编

    2017-05-22 18:09:27
    自从2015年7月,本人写了第一篇swift的文章到现在已经很久没有更新关于swift的内容。 每当swift1 -> swift2 -> swift3的时候都有一股莫名的... swift的学习学了不用,进步始终是甚微的。还是要在真正的项目中使用才...
  • 说起这个话题,在我看来,比项目中的OC混编C++,C等简单些,毕竟OCSwift都是苹果自己的开发语言,API什么的都一样,还是更容易混合开发些,好了,废话不多说,切正题,OCSwift怎么混和开发呢?OC类中可以引入...
  • IOS --- OCSwift混编

    2017-05-16 18:08:38
    先中简单的入手,先研究在同一个工程目录下混合使用的情况。...[cpp] view plaincopy--- OCSwift混编" TITLE="IOS --- OCSwift混编" />--- OCSwift混编" TITLE="IOS --- OCSwift混编" /> impor
  • OCSwift是苹果爸爸的原生语言,Swift代替OC的成本太高,需要过度和时间,但是现在的Swift的成长很快,在这个矛盾的时间,我们必须混编了。 1、创建一个新的工程 ,工程的名字叫OCAndSwiftDemo。 2、配置工程...
  • WWDC推出了SwiftUI、Combine,仅Swift可用~为了能顺利的也吃上SwiftUI,我也打算将自己的项目先从OC慢慢迁移到Swift,所以~一起从混编开始! 创建Swift的view 正常创建文件,语言选swift 创建Bridging Header 上...
  • Xcode 7.1项目中Objective-C和swift混合编程,文章的源代码。
  • 1.swift 混编 oc 第一步:新建一个swift 的工程 第二步:新建或者导入oc文件,在这里我新建了一个oc的视图 第三步:新建桥文件 在桥文件中导入相应的头文件 第四步:设置相应...
  • swift OC c++混编示例说明,主要包含有OC与c++混编说明以及swift oc c++混编生成framework
  • OCSwift混编注意点

    2019-09-25 10:41:25
    创建一个OC新工程 在其中创建一个Swift的文件 生产的test-Bridging-Header.h 为OC桥接文件 ,Xcode会自动配置 配置使OC能调用swift类 然后在需要调用swift类的地方加上头文件格式为:$(TARGET_NAME)-Swift.h ...
  • 最新一些学妹问起,所以抽点时间来写的,适合入门级别的swiftOC 混编 的程序猿。 本文章将从两个方向分别介绍 OCswift 混编 1. 第一个方向从 swift工程 中引入 oc类   1. 1 如何在swift的类中使用...
  • ocswift混编

    2016-08-21 15:39:20
    ocswift混编一、建立oc工程二、OC调用Swift写的类新建Swift类(Demo.swift)代码块// // Demo.swift // Test // // Created by 1391 on 16/8/21. // Copyright © 2016年 cuilu. All rights reserved. //import ...
1 2 3 4 5 ... 20
收藏数 542
精华内容 216
热门标签