混编Swift类和Objc类
语言: 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类相关推荐
- c++ python opencv_ubuntu下C++与Python混编,opencv中mat类转换
C++ 与 Python 混编 因为赶项目进度,需要使用到深度学习的内容,不过现有的深度学习框架大多使用python代码,对于不会改写C++的朋友来说,需要耗费大量的时间去改写,因此,使用python ...
- OC Swift混编-Swift.h File not found
https://www.jianshu.com/p/f860fe1718ca 2016.09.13 11:53* 字数 266 阅读 1935评论 1喜欢 1 今天碰到个神坑,本人项目是OC项目,最近 ...
- 初探swift语言的学习笔记九(OC与Swift混编)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- Swift与OC混编过程中的配置
女主宣言 在使用Swift进行iOS开发的过程中,经常涉及到Swift与OC混编的情况,有时主工程是OC的需要另外编入Swift代码,而有时主工程是Swift的需要另外编入OC代码.这其中涉及到修改一 ...
- IOS --- OC与Swift混编(转)
原文地址:http://blog.sina.com.cn/s/blog_8d1bc23f0102v5tl.html swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一 ...
- oc与swift混编教程
原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 swift 语言出来后,可能新的项目直接使用swift来开发, ...
- oc语言和c语言,OC和C语言的混编注意点和好处
苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...
- 百度App Objective-C/Swift 组件化混编之路(二)- 工程化
作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...
- Swift和Objective-C混编注意事项
前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...
- Swift和Objective-C混编
Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0 OCSwift混编 前言 Swift已推出数年,与O ...
最新文章
- Docker用Dockerfile定制镜像
- 手把手带你使用JS-SDK自定义微信分享效果
- mysql 恢复数据库 source_mysql数据库备份及恢复命令 mysqldump,source的用法 | 很文博客...
- mysql复制的工作原理及主从复制的实现
- mysql 端口 telnet 不通_3306端口不通,不一定是网络的问题
- 【个人重点】开发中应该重视的几点
- 力扣441.排列硬币
- 排序算法之 Shell Sort
- mysql操作SQL语句
- Idea 插件:快速JSON转对象
- QQ牧场接口协议分析
- matlab 频域采样定理,信号时域和频域采样函数周期性与原信号的关系
- 【FPGA - 基础知识(零)】FPGA芯片资源介绍
- wifi开启位置服务器,如何设置wifi定位服务器地址
- Chrome浏览器启动页被劫持解决
- 解决电脑可以上网却连不上局域网服务器问题
- 【机器学习】显卡、GPU、NVIDIA、CUDA、cuDNN
- 8051单片机Proteus仿真与开发实例-TLC2543(A/D)转换驱动仿真
- 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...
- vue实现自动语音播报功能,未解决。(已用js解决20220210)