语言: swift, 版本:4.2,XCode:10.1
写作时间:2019-02-13

说明

Swift与Objective-C混编。笔者记录新建Swift Project,然后Swift调用Objc,最后Objc调用Swift。
新建Swift Project > HybrideSwiftAndObjc

1.增加Objc类

新建Objc类 CustomObject

弹出提示框, 增加 Bridging Header, 选择 Create Bridging Header.

系统创建一个头文件 <#YourProjectName#>-Bridging-Header.h ,本项目自动创建的头文件为 HybrideSwiftAndObjc-Bridging-Header.h. 如果选错了,或者误删掉头文件,可以新建上面规则的头文件,添加到TARGETS > Build Settings > Swift Compiler - General > Objective_C Bridging Header.


项目不仅创建了Objc的头文件,同时创建了Swift的头文件,文件名格式**<#YourProjectName#>-Swift.h** , 在这里文件名为 HybrideSwiftAndObjc-Swift.h

CustomObject.h

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface CustomObject : NSObject@property (strong, nonatomic) id someProperty;- (void)someMethod;@endNS_ASSUME_NONNULL_END

CustomObject.m

#import "CustomObject.h"@implementation CustomObject- (void)someMethod {NSLog(@"SomeMethod Run");
}@end

引入Objc类头文件到Bridging-Header

swift类如何识别Objc类,就在于引入头文件,放到Bridging-Header,也就是文件> YourProject-Bridging-Header.h 。在下面头文件,引入被代用的Objc头文件。

HybrideSwiftAndObjc-Bridging-Header.h

#import "CustomObject.h"

验证swift对象调用Objc对象

APPDelegate.swift 新增方法

func swiftCallObjc() {let instanceOfCustomObject: CustomObject = CustomObject()instanceOfCustomObject.someProperty = "Hello World"print(instanceOfCustomObject.someProperty)instanceOfCustomObject.someMethod()
}

修改方法 didFinishLaunchingWithOptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {swiftCallObjc()return true
}

运行验证成功,控制台打印如下:

Hello World
2019-02-13 09:32:15.775243+0800 HybrideSwiftAndObjc[20391:1761308]
SomeMethod Run

注意:这里APPDelegate.swift类不需要引入头文件CustomObject.h, 这就是bridging header的作用。

Objc调用Swift

新建类MySwiftObject.swift

import Foundationclass MySwiftObject : NSObject {@objc var someProperty: String = "Some Initializer Val"override init() {}@objc func someFunction(someArg:AnyObject) -> String {let returnVal = "You sent me \(someArg)"return returnVal}
}

注意: Swift类中默认的属性,方法在Objc类中都是不可见的。在Swift类的属性、方法加修饰符 @objc 使其在Objc类中可见。 如果在Swift类中所有属性、方法在Objc类可以见,只要在Swift类的前面加上 @objc 即可。
类似如下:

@objc class MySwiftObject : NSObject 

在Objc类中引入Swift文件

在Objc类CustomObject.m 中引入#import "<#YourProjectName#>-Swift.h" , 这里引入的名字如下。

#import "HybrideSwiftAndObjc-Swift.h"

注意: 在任何Objc类引入swift文件,都是引入上面相同的头文件。

在Objc类中调用Swift类, 在CustomObject.m新增方法

- (void)objcCallSwift {MySwiftObject *myOb = [MySwiftObject new];NSLog(@"MyOb.someProperty: %@", myOb.someProperty);myOb.someProperty = @"Hello World";NSLog(@"MyOb.someProperty: %@", myOb.someProperty);// xcode10 expands the external arg hereNSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];NSLog(@"RetString: %@", retString);
}

注意:XCode10中调用方法,方法名需要拼接上参数名。

CustomObject.h增加方法,使其为公用方法

- (void)objcCallSwift;

在APPDelegate的方法swiftCallObjc()的最后增加代码

instanceOfCustomObject.objcCallSwift()

运行验证成功,控制台打印日志如下:

2019-02-13 09:52:47.134502+0800 HybrideSwiftAndObjc[20829:1803946]
MyOb.someProperty: Some Initializer Val
2019-02-13 09:52:47.134812+0800 HybrideSwiftAndObjc[20829:1803946]
MyOb.someProperty: Hello World
2019-02-13 09:52:47.135648+0800 HybrideSwiftAndObjc[20829:1803946]
RetString: You sent me Arg

总结

恭喜你,成功iOS混编Swift类和Objc类!
代码下载:
https://github.com/zgpeace/HybrideSwiftAndObjc

参考

https://stackoverflow.com/questions/24002369/how-to-call-objective-c-code-from-swift

混编Swift类和Objc类相关推荐

  1. c++ python opencv_ubuntu下C++与Python混编,opencv中mat类转换

    C++ 与 Python 混编 因为赶项目进度,需要使用到深度学习的内容,不过现有的深度学习框架大多使用python代码,对于不会改写C++的朋友来说,需要耗费大量的时间去改写,因此,使用python ...

  2. OC Swift混编-Swift.h File not found

    https://www.jianshu.com/p/f860fe1718ca 2016.09.13 11:53* 字数 266 阅读 1935评论 1喜欢 1 今天碰到个神坑,本人项目是OC项目,最近 ...

  3. 初探swift语言的学习笔记九(OC与Swift混编)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  4. Swift与OC混编过程中的配置

    女主宣言 在使用Swift进行iOS开发的过程中,经常涉及到Swift与OC混编的情况,有时主工程是OC的需要另外编入Swift代码,而有时主工程是Swift的需要另外编入OC代码.这其中涉及到修改一 ...

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

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

  6. oc与swift混编教程

    原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 swift 语言出来后,可能新的项目直接使用swift来开发, ...

  7. oc语言和c语言,OC和C语言的混编注意点和好处

    苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...

  8. 百度App Objective-C/Swift 组件化混编之路(二)- 工程化

    作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...

  9. Swift和Objective-C混编注意事项

    前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...

  10. Swift和Objective-C混编

    Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0  OCSwift混编 前言 Swift已推出数年,与O ...

最新文章

  1. Docker用Dockerfile定制镜像
  2. 手把手带你使用JS-SDK自定义微信分享效果
  3. mysql 恢复数据库 source_mysql数据库备份及恢复命令 mysqldump,source的用法 | 很文博客...
  4. mysql复制的工作原理及主从复制的实现
  5. mysql 端口 telnet 不通_3306端口不通,不一定是网络的问题
  6. 【个人重点】开发中应该重视的几点
  7. 力扣441.排列硬币
  8. 排序算法之 Shell Sort
  9. mysql操作SQL语句
  10. Idea 插件:快速JSON转对象
  11. QQ牧场接口协议分析
  12. matlab 频域采样定理,信号时域和频域采样函数周期性与原信号的关系
  13. 【FPGA - 基础知识(零)】FPGA芯片资源介绍
  14. wifi开启位置服务器,如何设置wifi定位服务器地址
  15. Chrome浏览器启动页被劫持解决
  16. 解决电脑可以上网却连不上局域网服务器问题
  17. 【机器学习】显卡、GPU、NVIDIA、CUDA、cuDNN
  18. 8051单片机Proteus仿真与开发实例-TLC2543(A/D)转换驱动仿真
  19. 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...
  20. vue实现自动语音播报功能,未解决。(已用js解决20220210)

热门文章

  1. linux开发arm音量加减代码,arm-linux学习:最简驱动模块(示例代码)
  2. jquery 文本编辑器插件
  3. 管理员取得所有权限.reg
  4. 推荐一个插件: The Great Suspender,大大减少chrome浏览器内存占用量
  5. linux命令与示例 week 3
  6. SaltStack系列(二)之常用模块介绍
  7. Linux 小知识翻译 - 目录 (完结)
  8. 谈谈BFC与ie特有属性hasLayout
  9. freemarker 如何获得list的索引值
  10. 领域驱动设计系列 (六):CQRS