前言

  • 在 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 的封装。

转载于:https://www.cnblogs.com/QianChia/p/5780770.html

iOS - OC 与 Swift 互相操作相关推荐

  1. IOS --- OC与Swift混编(转)

    原文地址:http://blog.sina.com.cn/s/blog_8d1bc23f0102v5tl.html swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一 ...

  2. iOS OC和Swift混编

    1.创建一个swift或者oc的工程:我这里是创建的Swift语言的工程,工程名SwiftTest    2.在工程中代码目录下创建一个oc的类,选择oc语言, 会出一个对话框,选择YES       ...

  3. iOS - OC 与 C 互相操作

    前言 在 Objective-C 语言中,我们可以使用 C.Swift 语言编写代码,我们可以导入任意用 C.Swift 写的 Cocoa 平台框架.C 框架或 Swift 类库. 1.在 C 中使用 ...

  4. iOS OC 及 Swift 获取手机型号,系统版本

    今天无意间使用到获取手机型号的问题了,发现直接写代码,根本无从下笔,无奈又找了以前写的代码,发现这些已经是几年写的了,新出的手机型号根本根本不存在了,今天正好使用,顺便更新了一下,这里我就更新一下iP ...

  5. IOS中的swift和oc关于对象模型的description方法重写

    IOS中的swift和oc关于对象模型的description方法重写 先讲OC的,oc比较重要,放在最前面. 首先创建一个cocoa Touch Class,继承NSObject, 命名Person ...

  6. iOS获取自1970年毫秒数使用OC和swift两种语法,返回字符串

    iOS获取自1970年毫秒数使用OC和swift两种语法,返回字符串 oc的话,我们定义一个category分类,对谁分类,对NSDate分类,对外暴露一个类方法,只要导入头文件,即可使用. @int ...

  7. iOS下OpenCV开发用OC还是Swift

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 其实标题中这个问题并不准确,准确的说法应该是iOS下的OpenCV开发是使用OC还是Swift ...

  8. IOS开发之OC-Switf 混编 -(OC 引 Swift 文件)

    上篇文章我们介绍了Swift 怎么引 OC 文件接来我们开始OC 引 Swift  文件. (一)OC 引 Swift  文件 1.创建 Demo ( 这个 Demo 名称一定要记住) 2.创建 Sw ...

  9. ios 可以为空声明_iOS开发中使用OC和swift的对比(2)

    OC与swift 1.协议 OC:主要用来传值 swift:不仅可以用来传值,swift中的协议可以定义属性方法,并且其协议可以进行扩展,在扩展中还可以有自己的默认实现,这个特性使其可以面向协议的时候 ...

最新文章

  1. TensorFlow2.0正式版发布,极简安装TF2.0(CPUGPU)教程
  2. 基于视觉的数学公式识别算法介绍
  3. 外星人计算机产品介绍,你对外星人电脑了解吗?感兴趣快看看!
  4. java enummap_Java EnumMap get()方法与示例
  5. getting joins
  6. vuex页面数据丢失_解决 vuex 中的数据在页面刷新之后就丢失的问题
  7. 18.go 日志监控系统
  8. 2、Linux多线程,线程的分离与结合
  9. 帆软部署到windows环境绝对路径及网络报表目录写法
  10. python颜色空间之HSV简介
  11. 设置Session超时的三种方法
  12. 拉格朗日方程的三种推导方法之基于欧拉-拉格朗日方程推导
  13. 软件工程——软件开发步骤
  14. win10扬声器没有声音但插入耳机有声音
  15. 企业信息化将推动企业组织结构和管理模式的变革
  16. ZZNU 1992: 情人节的尴尬
  17. 游戏‘微信打飞机 第一课
  18. 轻松学习CAN总线系列---2.了解CAN总线网络
  19. 信息搜集-敏感信息收集
  20. 2018年世界杯冠军竟然被大数据算出来了,还要比吗?

热门文章

  1. 【Kafka】Kafka安装部署
  2. 【C】输出乘法口诀表
  3. 【Oracle】重命名数据文件
  4. C#与Matlab混合编程中遇到的“MathWorks.MATLAB.NET.Arrays.MWNumericArray”的类型初始值设定项引发异常。
  5. mysql 使用service mysqld start 提示未识别服务 进入/etc/rc.d/init.d 下面未发现有mysqld解决方法
  6. 连接MYSQL数据库,报1130错误的解决方法
  7. 为什么rand()+ rand()产生负数?
  8. 如果你正在使用CocoaPods,你的.gitignore会有什么?
  9. 如何使用bash / sed脚本删除文本文件的第一行?
  10. java subset_Java中的TreeSet的subSet()方法 Java.util.TreeSet.subSet() - Break易站