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的工程:我这里 ...
随机推荐
- VPS常用工具
1.命令行工具 putty 在Mac下,可以直接使用超级终端 ssh username@ipaddress 2.可视化上传文件工具 WinSCP 在Mac下,使用 Cyberduck
- PIGS 分类: POJ 图论 2015-08-10 09:15 3人阅读 评论(0) 收藏
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18209 Accepted: 8277 Description Mir ...
- Poj(3615),Floyd,最大值中的最小值
题目链接:http://poj.org/problem?id=3615 题意:大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度).从x跳跃到y的路径消耗的体力值是路径中的一个 ...
- ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)
单独查看内存使用情况的命令:free -m查看内存及cpu使用情况的命令:top也可以安装htop工具,这样更直观,安装命令如下:sudo apt-get install htop安装完后,直接输入命 ...
- Codeforces Round #370 (Div. 2) B
Description Memory is performing a walk on the two-dimensional plane, starting at the origin. He is ...
- C# 对Xml的常用操作
using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...
- 【Web】简谈如何监听浏览器的关闭
> 参考的优秀文章 beforeunload实现关闭离开的提示 想起以前做的一个小系统,一个企业内部小型的测试系统,让考生在给定时间内完成考试,如果考生中退出,那么下次进来可以利用剩余的考试时间 ...
- 【MySQL】过滤后的结果集较大,用LIMIT查询分页记录,查询效率不理想
> 参考的优秀文章 优化LIMIT分页--<高性能MySQL>(电子工业出版社) > 场景描述 遇到一个场景:查询排序后的结果集较大,我们采用分页显示,每页显示20条记录,但是 ...
- 【Linux】用grep在文档中查找内容
有时候,我们需要在文档中查找一些内容,常用grep.它在文档查找相关内容并输出匹配行. > 查找某关键字 在system.log中,查找包含keyword的行 grep 'keyword' sy ...
- 《JAVA与模式》之策略模式
<JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...