IOS --- OC与Swift混编
swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编。这个在IOS8中是允许的。 先中简单的入手,先研究在同一个工程目录下混合使用的情况。 为了演示。先准备两个类 第一个是swift语言写的类,文件名为 act.swift [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 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 头文件 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 #import @interface OCChannel : NSObject @property (nonatomic,retain) NSString *ChannelName; - (NSString *)ChannelChange:(NSInteger) channels; @end
实现文件 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 #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,利用第一次新建提示的方式自动添加桥接头文件。
点确定这后就会生成一个以的头文件。 建好后的工程:
这里有一个地方需要注意的就是在targets->build settings ->Object-C Bridging Header 设为哪个桥接的头文件即可。
经过上述步骤,桥接文件弄好了就可以 尽情的把想要在swift类中调用的OC头文件放使用import "" 写到这个桥接文件中吧。就像: [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 // // 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写的类了。 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 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下来。就像下面: [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 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.
IOS --- OC与Swift混编的更多相关文章
- 【转】IOS --- OC与Swift混编
群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...
- Swift语言学习之OC和Swift混编
本文转自http://www.helloswift.com.cn/swiftbase/2015/0112/3469.html iOS OC和Swift混编 1.创建一个swift或者oc的工程:我这里 ...
- OC跟Swift混编
OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue 独立博客:http://mengxiangyue ...
- OC与swift混编 #import "项目名-Swift.h"失效问题
由于项目多个环境部署,每次改配置比较麻烦,所以线上环境一个TARGETS,内部环境一个TARGETS, 都知道oc和swift混编的时候,会生成一个'项目名-Swift.h'文件,这个文件是隐式的,需 ...
- OC与Swift混编
群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...
- OC与Swift混编,三种场景的实现方式
多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...
- oc工程中oc、swift混编代码打包成静态framework踩坑笔记
参考资料: https://www.jianshu.com/p/734341f7c242 https://www.jianshu.com/p/55038871e7de 两天时间探索,期间不知道遇到 ...
- iOS开发之-- oc 和 swift混编之自建桥接文件
进行swift开发的时候,oc 的项目已经进行了很长一段时间,所以默认使用Xcode自建的桥接文件的时候,这个桥接文件名称是固定的,放置的目录也是无法更改的,所以我就想自己创建一个桥接文件,然后在ta ...
- oc和swift混编 使用use_frameworks!后编译出错
Swift项目中同时使用OC的库和Swift的库时,用CocoaPods导入时添加use_frameworks! 如果在cocoapods 里面不使用use_frameworks!,则是通过stati ...
随机推荐
- dubbo(转载)
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- Seo标签权重
最近接手凤凰焦点的业务,首先做的现有线上业务梳理,接着是拆分模块. 页头部分有些争议.假设把页头做成一个组件,pc端因为不能页面加载的差不多了页头才突兀的出来一是体验不好,还有不利于seo,最终决定还 ...
- 物理Data Guard的日常维护
关闭顺序 1. 首先关闭primary数据库 [oracle@Master admin]$ sqlplus / as sysdba SQL> shutdown immediate 2. 关闭st ...
- IOS开发之GCD---dispatch_semaphore
信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待.当一个信号量被信号通知,其计数会被增加.当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零, ...
- Oracle Deadlock / 死锁 处理
Get the directory of alert log sqlplus / as sysdba show parameters udmp SQL> show parameters dump ...
- Java中如何获取spring中配置文件.properties中属性值
通过spring配置properties文件 1 2 3 4 5 6 7 8 9 <bean id="propertyConfigurer" class="co ...
- js 数组赋值问题 :值传递还是引用?
转载于知乎var a = [1,2,3]; var b = a; a = [4,5,6]; alert(b); //[1,2,3] 面试时被问到这样一个问题,竟然从来没试过... 当时直接的理解,数组 ...
- 用js生成PDF的方案
在java里,我们常用Itext来生成pdf,在pdf文件里组合图片,文字,画表格,画线等操作,还会遇到中文支持的问题. 那好,现在想直接在web前端就生成pdf怎么办,目前有以下几个解决方案 1:J ...
- navigation controller
一.程序框架 1.程序结构
- openssl 非对称加密 RSA 加密解密以及签名验证签名
1. 简介 openssl rsa.h 提供了密码学中公钥加密体系的一些接口, 本文主要讨论利用rsa.h接口开发以下功能 公钥私钥的生成 公钥加密,私钥解密 私钥加密,公钥解密 签名:私钥签名 验 ...