在oc项目中添加swift文件

2016-02-27 09:23:30 mengxiangyue 阅读数 32523

OC项目中使用Swift

本文版权归作者所有,如需转载请联系孟祥月
CSDN博客:http://blog.csdn.net/mengxiangyue
独立博客:http://mengxiangyue.com

最近公司的项目开始计划使用Swift,由于原先的工程都是使用OC编写的,不可能一下全部转换成Swift,所以采用OC与Swift混编的方式是最好的选择。这篇文章只是一个简单的介绍,并没有太高深的知识。

我新建了一个演示的OC工程,当然你可以使用你已经存在的OC的工程。如果我们想要在OC工程中使用Swift的代码,Swift的代码默认是使用module管理的,同样这里我们也需要把我们的Swift代码作为一个module暴露给我们的OC工程,修改下面的配置:

上面的修改了一个配置项,有一个Product Module Name在后面会使用。

在工程里面点击File/New/File…,选择iOS/Source/Cocoa Touch Class,按照如下填写创建一个新的文件:

上图中的Subclass of一定要设置为NSObject或其子类,否则OC工程将不会找到该类。

点击确认后会选择保存路径,点击Create,出现如下界面:

这个界面是询问是否创建桥接的头文件,这个文件在Swift调用OC代码的时候比较管用,但是在OC中调用Swift的时候我发现没有什么卵用。

选择Don’t Create按钮。

在Test.swift中添加如下的代码(解释都在注释里面了):

import UIKit

/*
    如果Swift类想要被OC发现,必须继承自NSObject并且使用public标记,并且该类中想要被OC访问的方法也必须使用public标记,具体知识可以去看Swift的访问控制
    原因:Swift的代码对于OC来说是作为一个module存在的

    当然全局的Swift函数,我还没发现怎么在OC中访问,如果哪位清楚还请告诉一下,谢谢!
*/


public class Test: NSObject {
    public func log() {
        print("这是Swift的方法")
    }
}

public func globalLog() {
    print("这是Swift全局的log方法")
}

我们在我们想要调用Swift类的方法里面引入头文件:”Product Module Name-Swift.h”,其中Product Module Name替换成在上面配置项中显示的内容,例如:

#import "ViewController.h"
// 引入Swift头文件
#import "OCAndSwift-Swift.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 使用Swift的类
    Test *test = [[Test alloc] init];
    [test log];
}

@end

这样我们就能够在OC中使用Swift的代码了,最后还要说明一点:”Product Module Name-Swift.h”(例子中的是OCAndSwift-Swift.h),是由编译器自动生成的,如果import后没有提示,编译一下。并且只有在工程中包含至少一个Swift文件的时候,才会自动生成这个文件,所以如果工程中如果没有Swift文件的时候,就算在配置中设置对了,import该文件也会报错。

2017-09-28 16:19:52 wanglei0918 阅读数 4445
  • 在项目中右键添加一个swift文件,我添加的LearnSwift.swift
  • 添加后Xcode弹出‘是否配置oc桥接头文件’的提示,点确认,系统自动生成一个项目名-Bridging-Header.h的文件,我的是LearnSwift-Bridging-Header.h

    配置oc桥接头文件的提示
  • LearnSwift-Bridging-Header.h实质上是一个供swift使用的头文件,在这里把所有要暴露给swift的oc头文件都添加进去,这样写swift的时候就可以直接使用那些oc的类和方法了。
    因为swift本身没有头文件,只有.swift;而oc有.h和.m文件。有了这个声明,.swift就可以直接使用oc的.h了

    我的LearnSwift-Bridging-Header.h文件内容
  • 接下来就可以直接在LearnSwift.swift中写swift代码啦 ~ 随便声明一个类,打些log:

    我的LearnSwift.swift文件内容

    编译直接通过,这就是在swift中使用oc类和方法了,一切顺利!
  • 在oc中使用swift,我在AppDelegate.m中使用刚才创建的swift类,那么先要引用swift头文件,即#import "LearnSwift-Swift.h",然后在这个.m文件中就可以任意使用swift创建的类和方法了:
    LearnSwift *learnSwift = [[LearnSwift alloc] init];[learnSwift logsth:@"code from oc"];
    编译运行直接过! 输出:
    this is a log from swift : code from oc
  • 理解下#import "LearnSwift-Swift.h"
    其实是项目名-Swift.h,这也是Xcode自动生成的,根据你写的所有swift代码,生成一个oc的.h文件,进行类和方法的声明,这样在oc里引用这个头文件后,就相当于引用了所有swift声明,可以直接使用了。


  • 2017-08-10 13:40:37 qq_33298465 阅读数 4994

    有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用。

     

    swift调用oc的方法:

    1、桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可)

    2、将需要引用的oc文件 .h头文件 添加到桥接类中。

     

    如下:

    然后在swift调用处,直接就可以使用了。

     

    oc调用swift的方法:

    1、首先设置一下Packing

    进入TARGETS ->Build Settings -> Packaging 中

    设置Defines Module为YES

    设置 Product Module Name (这个也可以不设置,直接使用默认就行)

    如图:

     

     2、设置完之后,在需要引用的oc文件头部  import一下,格式为: #import "工程名-Swift.h"

          比如:#import "OrderSystem-Swift.h"

     

    然后就可以使用swift文件了

     

    对了,本文是基于swift创建的工程,两种情况分别对应正常的 swift引用oc文件,以及在oc文件内回头引用swift文件。

    如果是基于oc创建的工程,暂未测试。

    2016-02-26 16:29:46 msyqmsyq 阅读数 6775
     对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有一定折扣.
    • 现在swift虽然仍然存在很多缺陷,但是鉴于苹果的强势,是时候在项目中把简单的功能交给swift了,给自己,给项目,给swift一个缓冲区,都是极好的.

      说了这么多,开始上代码.

      现在的背景是: 已经有一个oc项目了,我想要加入 swfit,并且实现 oc调用 swift ,swift调用oc .

      1.新建一个swift文件

      2.接下来会询问你是否建立桥接文件,点击是 ,那么我后面的就是多余的了,所以选择取消,我们手动建立桥接文件

      3.手动建立桥接文件:新建头文件

      关于命名: 有经验的人都知道,这个头文件是项目公用的,同时如果自动创建,文件名也是 :

      项目名-Bridging-Header.h

      但是因为我现在的项目名是中文,所以我自己命名了一下.

       

      4. 配置头文件

      在build setting里面搜索 swift ,根据实际情况进行配置:

      注意:是相对于工程文件所在的相对路径.从 Finder里面看,不要让项目中得group扰乱你的判断

      5.在头文件中引入需要的 oc头文件,这里我就用 UIKit了

       

      6.编写代码

       

      可以看到,我们可以使用UIKit的类了

      注意:关于自定义类,希望有个好的命名规范,那么在混合编程中,你将受益无穷

      7.oc调用swift

      现在因为测试我想把窗口的根控制器设置为我的swift的那个.

      因为swift没有头文件,所以不好办了...

      其实,系统默认给我们生成了头文件(需要我们的swift类是NSObject的直接或者间接子类),我们只要引入

      项目名-Swift.h

      没办法了,我的项目名是中文...

      引入:

      8.使用 swift的类

      9.运行

      一切正常 (好丑,不要吐槽)

       


    2017-04-12 20:11:58 studying_ios 阅读数 5955

    最近在研究swift,就我看来,swift确实是比OC更优秀的语言,这可以体现在很多方面,网上已经对比的很透彻,就不一一赘述。
    今天研究了一下如何在OC项目中使用swift文件,即OC和swift的混编问题,发现在OC中要使用swift文件也是蛮简单的,实践过程列如下:
    1)首先随便创建了一个OC项目,就叫 DetialViewDemo
    这里写图片描述
    2)因为Swift的代码默认是使用module管理的,所以两者混编的最重要的一步,就是把我们的Swift代码作为一个module暴露给OC工程,具体步骤如下:
    这里写图片描述
    3)创建一个swift文件或者将已有的swift文件拖入项目中,我这里是拖入了一个练习swift写的一个类:
    这里写图片描述
    注意点:swift文件添加的时候会提示是否添加桥接文件,直接点击不创建就OK
    4)好了,文件都准备好了,接下来就需要在使用到swift文件的类中引入”Product Module Name-Swift.h”,其中Product Module Name其实就是项目的名称,这个在上面配置Module的图中也能看到,然后我们就可以愉快地和swift进行玩耍了
    这里写图片描述
    注意:引入Product Module Name-Swift.h的时候不一定自动提示,手写之后编译就可以了

    当然,我很好奇这是怎么回事,然后我就command+点击 Person 进入了内部查看,发现原来苹果将所有的swift文件中的代码转成了oc的代码,不管你引入多少个swift文件,都会一股脑在Product Module Name-Swift.h文件中翻译成oc文件以便我们oc程序调用
    这里写图片描述

    怎么样,很强大吧,朋友们赶紧转过来吧,开始自己的swift开发,这绝对是苹果的未来啊!

    OC项目使用swift

    阅读数 939