iOS - OC 与 Swift 互相操作
前言
- 在 Swift 语言中,我们可以使用 Objective-C、C 语言编写代码,我们可以导入任意用 Objective-C 写的 Cocoa 平台框架、Objective-C 框架或 C 类库。
1、在 Swift 中使用 Objective-C、C 代码
1.1 在 Swift 项目中使用 Objective-C、C 代码
1> 在 Swift 项目中创建 OC/C 的 .h 和 .m / .c 文件,文件中的格式为其本有的格式。
2> Xcode 提示是否创建 Objective-C bridging 头文件,点击 Yes 创建,Xcode 会自动创建一个桥接头文件,文件名的格式是 "项目名-Bridging-Header.h"。
一般情况下,Xcode 辅助生成的桥接头文件在编译属性里已经帮我们设置了引用,如果没有的话需要自己将其配置到项目中,选中项目中的 Targets => Build Setting => Swift Compiler - general => Objective-C Bridging Header 属性,双击配置成 “项目名/项目名-Bridging-Header.h” 即可。

3> 在此桥接头文件中添加所创建的 OC/C 文件的头文件( #import "*****.h" )。
4> 在 main.swift 文件中无需添加头文件,直接使用创建的 OC/C 文件中的类、方法或函数即可。
1.2 在 Swift 项目中的 Objective-C 代码中使用 Swift 代码
1> 在 .Swift 文件中每一个方法和类名前都加 @objc 前缀来修饰,以便在 Objective-C 中可以访问。新版 Swift 代码中已不需要再添加。
2> 在 Swift 项目中创建 OC 的 .h 和 .m 文件,文件中的格式为其本有的格式。
3> Xcode 提示是否创建 Objective-C bridging 头文件,点击 Yes 创建,Xcode 会自动创建一个桥接头文件,文件名的格式是 "项目名-Bridging-Header.h"。
一般情况下,Xcode 辅助生成的桥接头文件在编译属性里已经帮我们设置了引用,如果没有的话需要自己将其配置到项目中,选中项目中的 Targets => Build Setting => Swift Compiler - general => Objective-C Bridging Header 属性,双击配置成 “项目名/项目名-Bridging-Header.h” 即可。

4> 在此桥接头文件中添加所创建的 OC 文件的头文件( #import "*****.h" )。
5> 在 OC 的 .m 文件中添加头文件 “#import "项目名-Swift.h"”,在此文件中直接使用 .Swift 文件中的类、方法即可。
"项目名-Swift.h" 这个头文件是 Xcode 自动产生的,如果不是引用外部 Swift 语言编写的框架,不需要我们做过多配置,但是如果是引用外部框架,需要我们进行配置:选中项目中的 Targets => Build Setting => Packaging => Defines Module 修改成 Yes,然后在 Build Setting => Packaging => Product Module Name,设置一个名称,例如 SwiftInAction。特别注意的是,这个名称不能有 “-” 等字符。这样我们在 OC 的 .m 文件中就可以添加 "SwiftInAction-Swift.h" 了,这个名字是 Xcode 根据设置的模块名自动生成的。

6> 在 main.swift 文件中无需添加头文件,直接使用创建的 OC 文件中的类、方法。
2、在 Objective-C 中使用 Swift 代码
2.1 在 Objective-C 项目中使用 Swift 代码
1、在 OC 项目中创建 .Swift 文件,文件中的格式为其本有的格式。
2、Xcode 提示是否创建 Objective-C bridging 头文件,点击 Yes 创建,Xcode 会自动创建一个桥接头文件,文件名的格式是 "项目名-Bridging-Header.h"。
一般情况下,Xcode 辅助生成的桥接头文件在编译属性里已经帮我们设置了引用,如果没有的话需要自己将其配置到项目中,选中项目中的 Targets => Build Setting => Swift Compiler - general => Objective-C Bridging Header 属性,双击配置成 “项目名/项目名-Bridging-Header.h” 即可。

3、在 OC 的 .m 文件中添加头文件 “#import "项目名-Swift.h"”,在此文件中直接使用 .Swift 文件中的类、方法即可。
"项目名-Swift.h" 这个头文件是 Xcode 自动产生的,如果不是引用外部 Swift 语言编写的框架,不需要我们做过多配置,但是如果是引用外部框架,需要我们进行配置:选中项目中的 Targets => Build Setting => Packaging => Defines Module 修改成 Yes,然后在 Build Setting => Packaging => Product Module Name,设置一个名称,例如 SwiftInAction。特别注意的是,这个名称不能有 “-” 等字符。这样我们在 OC 的 .m 文件中就可以添加 "SwiftInAction-Swift.h" 了,这个名字是 Xcode 根据设置的模块名自动生成的。

在开始的几次编译或者代码调试中,可能会出错,提示找不到这个自动生成的文件,一般对项目进行 clean 操作可以解决问题,具体是点击 Product 菜单下的 clean 菜单项即可。
2.2 在 Objective-C 里使用 Swift 限制
1、一些 Swift 特有的类型,例如元组、泛型、类型别名、嵌套类型等,不能在 Objective-C 里使用。
2、不能在 Objective-C 里继承 Swift 类型。
3、数据类型之间需要互相映射关联。可以 Objective-C 核心类型到 Swift 中的替代类型,例如 NSString 到 String。Objective-C 确定类型到 Swift 中的同等类型,例如 id 到 AnyObject。Objective-C 概念到 Swift 中相匹配的概念,如 pointers 到 optionals。
4、不能直接把 C++ 代码导入 Swift,解决办法是为 C++ 代码创建一个 Objective-C 或者 C 的封装。
iOS - OC 与 Swift 互相操作的更多相关文章
- ios oc调用swift framework
1.oc 调用swift /*oc调用swift, project name为DeomOC: 1.oc工程DemoOC中显式创建一个swift文件,生成DemoOC-Bridging-Header.h ...
- IOS --- OC与Swift混编
swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...
- iOS OC和Swift进行互相调用
有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用. swift调用oc的方法: 1.桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可) 2 ...
- 【转】IOS --- OC与Swift混编
群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...
- iOS OC与swift相互调用
小哥("我"的自称)个人混编的时候喜欢先创建OC项目,然后在项目中创建swift类.这样有个好处就是桥文件可以自动创建的同事路径不需要我手动去写了,另外还有个目的就是现在小哥自我感 ...
- iOS - OC 与 C 互相操作
前言 在 Objective-C 语言中,我们可以使用 C.Swift 语言编写代码,我们可以导入任意用 C.Swift 写的 Cocoa 平台框架.C 框架或 Swift 类库. 1.在 C 中使用 ...
- iOS oc 调用 swift
如股票oc要调用swift里面的代码 需要包含固定这个头文件 项目名称 LiqunSwiftDemo-Swift.h #ProjectName#-Swift.h 固定的写法 swift 目的 是取代o ...
- iOS oc和swift中协议的使用
创建一个空的工程 在工程中我们新建一个类 继承与NSObject 定义一个协议‘ @protocol UpdateAlertDelegate <NSObject> //这里的红色字体就是我 ...
- Swift语言学习之OC和Swift混编
本文转自http://www.helloswift.com.cn/swiftbase/2015/0112/3469.html iOS OC和Swift混编 1.创建一个swift或者oc的工程:我这里 ...
随机推荐
- C#:序列化值与解码二进制
1.将对象序列化为二进制值,供WebBrowser传值: private static byte[] PostDataToBytes(Data postData) { JavaScriptSerial ...
- jquery 当前链接激活传递参数|div的切换显示
一.链接激活时传递参数 $("a").click(function(){ var obj=$(this).attr("field"); //获取当前field ...
- python 补充-decode和encode
1. decode与encode转码 在Python3中默认编码就是uncode,encode转成Byte类型 在Python2中默认编码就是ascii window下默认编码是GBK decode( ...
- Quick-cocos2d-x v3.3 SocketTCP链接(转)
Quick-Cocos2d-x v3.3里面提供了两种长连接WebSockets.SocketTCP,这里说一下SocketTCP的用法. 1 2 3 local net = require(&quo ...
- 过滤器Filter(拦截jsp页面的跳转)案例:
创建一个 Filter , class类: 其继承于 接口 Filte(接口导包:import javax.servlet.Filter;) 在 web.xml 文件中配置并映射该 Filter. 其 ...
- HTML学习之canves元素
1:绘制画布 和在画布上绘制矩形 <!DOCTYPE html> <html> <head lang="en"> <meta charse ...
- python爬虫之Scrapy 使用代理配置
转载自:http://www.python_tab.com/html/2014/pythonweb_0326/724.html 在爬取网站内容的时候,最常遇到的问题是:网站对IP有限制,会有防抓取功能 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online HDU5882
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5882 解法:一个点必须出度和入度相同就满足题意,所以加上本身就是判断奇偶性 #include<std ...
- c++のdll两种调用方式
调用DLL有两种方法:静态调用和动态调用. (一).静态调用其步骤如下: 1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下; 2.把你的youApp. ...
- 2016年10月14日 星期五 --出埃及记 Exodus 18:25
2016年10月14日 星期五 --出埃及记 Exodus 18:25 He chose capable men from all Israel and made them leaders of th ...