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 的封装。
时间: 2024-10-27 07:45:06

iOS - OC 与 Swift 互相操作的相关文章

iOS - OC 与 C 互相操作

前言 在 Objective-C 语言中,我们可以使用 C.Swift 语言编写代码,我们可以导入任意用 C.Swift 写的 Cocoa 平台框架.C 框架或 Swift 类库. 1.在 C 中使用 Objective-C 代码 1.1 在 Objective-C 项目中的 C 函数中使用 Objective-C 代码 1> 在 .m 文件中定义函数指针. static ViewController *selfClass = nil; // 函数指针指向本身 selfClass = self;

Swift 共享文件操作小结(iOS 8 +)_IOS

前言 适用于 iOS 8 + 本地共享文件列表 正文 一.准备 1.1 默认 App 的文件共享是关闭的,需要在 plist 中设置启用: Application supports iTunes file sharing 设置为 YES 启用后把设备连接到 iTunes 上,在 iTunes 应用里的文件共享就能看到你的 App 了(如果看不见需要断开重新拔插一下数据线),可以拷贝一些视频进去,便于测试. 1.2 导入库 Photos.framework AVKit.framework 用于播放

iOS - OC 面向对象语法

1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之后的一对圆括号"( )"中. @interface QCStudent (Print) @end @implementation QCStud

求问ios大神swift学习流程

问题描述 求问ios大神swift学习流程 本人计算机大学生一枚,有过肤浅的php开发经验,现在想认真学一门语言,选择了swift,但是遇到了一些问题,首先是swift2.0资源弄不到,还有就是出了单纯的看书敲代码不知道怎么学习,求师傅传授 解决方案 目前对于ios学习的话,建议先学习使用oc开发ios,等基础扎实再向swift转型,转型速度是非常快的(两周左右可比较完善) 如果坚持直接学swift,想要较全面的了解常用基础的话,可以考虑下培训机构,因为国内的swift交流非常稀少,很难帮助学习

ios-目前市场使用oc,swift开发占有比例?

问题描述 目前市场使用oc,swift开发占有比例? objective-C 开发的.swift 开发占有比例?目前主流的iOS开发还是oc吧? 解决方案 2015年5月,在所有编程语言中,oc占5.393%,swift占1.115%,可以搜索编程语言排行榜,虽然不一定准确,但是大体上不会差太多 解决方案二: 是的,不过你看oc从前三跌出前十,而swift一路高歌,短短两年挤进TOP20,就可以看出势头了 解决方案三: swift占有趋势越来越多.感觉个人会转. 解决方案四: swift占有趋势

iOS - OC RunTime 运行时

1.运行时 运行时是苹果提供的纯 C 语言的开发库,是一种非常牛逼.开发中经常用到的底层技术. 1.1 运行时原理 Objective-C 是一门简单的语言,95% 是 C,只是在语言层面上加了些关键字和语法,真正让 Objective-C 如此强大的是它的运行时.它很小但却很强大,它的核心是消息分发. 1.Messages 执行一个方法,有些语言,编译器会执行一些额外的优化和错误检查,因为调用关系很直接也很明显.但对于消息分发来说,就不那么明显了.在发消息前不必知道某个对象是否能够处理消息.你

[译]iOS开发者在Swift中应避免过度使用

本文讲的是[译]iOS开发者在Swift中应避免过度使用, 就在前几天,我终于把项目迁移到了Swift2.2,在使用SE-0022建议的#selector语句时,我遇到了一些问题.如果在protocol extension中使用#selector,这个protocol必须添加@Objc修饰符.而之前的Selector("method:")语句则不需要添加. 通过协议的扩展配置视图控制器 为了达到本文的目的,我简化了工作中项目的代码,但所有核心的思想都保留着.一种我经常在swift里用的

ios oc对象不可以直接写到plist中..

问题描述 ios oc对象不可以直接写到plist中.. ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中.. 解决方案 你可以写到 NSUserDefault 中, 也就是常说的 User setting, 可以把它当 NSDictionary 来用. 解决方案二: 必须是nsstring,array,dictionary,set等的子类 解决方案三: plist里面一般都是字典数组字符串之类的,你要存对象得

iOS 文件及字符串相关操作汇总 - 持续更新中......

iOS 文件及字符串相关操作汇总 - 持续更新中...... 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 1.获取应用包中文件的绝对路径: NSString *absoluteFileNam