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

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

为了演示。先准备两个类

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

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

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

头文件

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

实现文件

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

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

方式二:

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

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

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

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

OC如何调用Swift写的类

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

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

产生步骤:

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

这样,工程中如查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. @objc(Act)
  3. class Act
  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. @objc(init)//原本以为加上这个alloc就可以找到,但不行的。。。
  16. init()
  17. {
  18. println("act constructor is called.")
  19. }
  20. deinit
  21. {
  22. println("act destroyed is called.")
  23. }
  24. }

但是在使用时你就会发现

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

初探swift语言的学习—Object-C与Swift混编的更多相关文章

  1. iOS之Swift语言的学习

    好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...

  2. iOS新的旅程之Swift语言的学习

    好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...

  3. iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

    swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...

  4. 初探swift语言的学习笔记四(类对象,函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  5. 初探swift语言的学习笔记七(swift 的关健词)

    每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, impor ...

  6. 初探swift语言的学习笔记五(线程)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30354127 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  7. 初探swift语言的学习笔记十一(performSelector)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  8. 初探swift语言的学习笔记三(闭包-匿名函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  9. 初探swift语言的学习笔记十(block)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35783341 转载请注明出处 假设觉得文章对你有所帮助,请通过留言 ...

随机推荐

  1. Mac 10.7.*安装XCode3.2.6的方法

    1.首先,在Xcode 3.2.6的磁盘映像(dmg文件)上点击右键,选择“磁盘工具”打开,如图1所示,转换成一个可读写的dmg文件,如图2所示. 图1 图2 转换好后双击它,让它在Finder里面显 ...

  2. git代码提交流程

    1.进入我的项目文件夹所在目录: 2.git status 查看我修改过的文件: 3.git add -A 将修改的文件全部添加, git add 文件名  只添加指定的文件名: 4.git comm ...

  3. win7中注册tomcat服务

    非安装版tomcat下载后,在bin文件夹会有一个startup.bat文件,运行该文件即可启动tomcat了.不过在服务器配置tomcat的话,就通常需要注册为服务. 在/bin文件下还有tomca ...

  4. 解决android TextView多行文本(超过3行)使用ellipsize属性无效问题

    布局文件中的TextView属性 <TextView android:id="@+id/businesscardsingle_content_abstract" androi ...

  5. 直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)

    在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法. ...

  6. Java图形化界面设计——布局管理器之GridLayout(网格布局)

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...

  7. frame.origin.x 的意思和作用?

    frame.origin.x 的意思和作用? scrollView.frame 一个view的frame 包含它的矩形形状(size)的长和宽. 和它在父视图中的坐标原点(origin)x和y坐标 f ...

  8. web前端的发展态势

     以前 作为一个java程序员写的代码主要还是后台的代码,虽然开始的时候前后端都写,但是也是用别人造好的轮子来用,学学html,css,js,jquery,再找一个前端ui框架学学,上手之后我们就可以 ...

  9. HDU - 1116 Play on Words(欧拉图)

    有向图是否具有欧拉通路或回路的判定: 欧拉通路:图连通:除2个端点外其余节点入度=出度:1个端点入度比出度大1:一个端点入度比出度小1 或 所有节点入度等于出度 欧拉回路:图连通:所有节点入度等于出度 ...

  10. USACO Section 5.4 TeleCowmunication(最小割)

    挺裸的一道最小割.把每台电脑拆成一条容量为1的边,然后就跑最大流.从小到大枚举每台电脑,假如去掉后 最大流=之前最大流+1,那这台电脑就是answer之一了. -------------------- ...