本文主要闲聊一些 Objective-C 和 Swift 混编项目带来的一些潜规则,希望能帮到对此感到疑惑的朋友。下面我们开始进入主题:

命名

官方 Guide 上只是简单叙述(Using Swift with Cocoa and Objective-C),即 Swift 编译器会在我们使用 Objective-C 的 API 时自动的将其转成 Swift 风格的 API(说白了就是会对一些方法名、枚举名等等做一些有规则的删减,即重命名)。

单例方法命名

在 Swift 中引用 Objective-C 单例时,如果单例方法包含于类名,则会出现编译错误,下面我们来看几个例子。

Example 1


@interface TXLocationManager : NSObject+ (instancetype)manager;@end复制代码

TXLoginManager 类有一个单例方法命名为 manager,在 Swift 中引用 manager 方法时,会出现编译错误:

说白了,manager 方法已经废了。。。

Example 2

在 Example 1 的基础上,我们把单例方法的命名改一改:


@interface TXLocationManager : NSObject+ (instancetype)shareInstance;@end复制代码

单例方法命名改成 shareInstance 后,编译通过了。至此,至少问题已经解决了,现在我们再简单看看是什么原因?为何 manager 方法无法引用,而 shareInstance 却可以引用呢?

Example 3

在 Example 1 的基础上,把 manager 单例方法名称改为 shareManager :


@interface TXLocationManager : NSObject+ (instancetype)shareManager;@end复制代码

我们可以发现在 Swift 中引用时,shareManager 方法名被重命名为 share :

小结

至此,我们可以得出一个简单的命名潜规则:在 Swift 中引用 Objective-C 单例时,如果单例方法包含于类名,则会出现编译错误,准确的说,应该是如果单例方法的名称正好是该类名驼峰命名的后缀,那么在 Swift 中引用该单例方法时,会出现编译错误。

为何在 Swift 中引用 Objective-C 类的 API 会出现这种问题呢?官方 Guide 上时这样描述的:

The Swift compiler automatically imports Objective-C code as conventional Swift code. It imports Objective-C class factory methods as Swift initializers, and Objective-C enumeration cases truncated names.

因为 Swift 编译器在使用 Objective-C 的代码时会自动的将其转成 Swift 风格的代码,就是会对一些方法名、枚举名等等做一些有规则的删减。

There may be edge cases in your code that are not automatically handled. If you need to change the name imported by Swift of an Objective-C method, enumeration case, or option set value, you can use the NS_SWIFT_NAME macro to customize how a declaration is imported.

根据官方 Guide,上述的这种 case 属于 特殊的情况。那如何解决这种问题呢,Swift 提供了一个宏,专门处理我们遇到的这种 case —— NS_SWIFT_NAME


@interface TXLocationManager : NSObject+ (instancetype)manager NS_SWIFT_NAME(shareInstance());@end复制代码

这样,manager 该单例方法,当我们在 Swift 中引用时,会被重命名为 shareInstance。


let _ = TXLocationManager.shareInstance()复制代码

普通方法命名

有时候,我们在 Swift 中引用 Objective-C 中某个类的 API 时,方法名是可能会被重命名的,下面我们直接看例子。

类方法


@interface TXLocationManager : NSObject+ (instancetype)managerWithCoordinateY:(CGFloat)y// Or
// + (TXLocationManager *)managerWithCoordinateY:(CGFloat)y@end复制代码

当该类的类方法返回自身类型的实例对象时,上述的方法会被重命名。应该这样引用:

// 方式一:
let _ = TXLocationManager.init(coordinateY: 9)// 方式二:
let _ = TXLocationManager(coordinateY: 9)// 错误引用方式,编译失败
let _ = TXLocationManager.manager(withCoordinateY: 9)复制代码

通过上述实践,我们可以发现类方法中的 manager 前缀会被删掉,而且变成了 Swift 中的 init 方法。如果该类的类方法不返回自身类型的实例对象呢?


@interface TXLocationManager : NSObject+ (void)managerWithCoordinateY:(CGFloat)y;// Or
// + (NSObject *)managerWithCoordinateY:(CGFloat)y;
// + (CGFloat)managerWithCoordinateY:(CGFloat)y;@end复制代码

通过实践可以发现,在 Swift 中是可以这样引用的:


TXLocationManager.manager(withCoordinateY: 9)复制代码

这种方式的引用同我们一般的方法引用是一致的,无异同。

实例方法

实例方法的重命名规则与类方法有点相似,此处就不再详述了,感兴趣的朋友可以自己实践一下。(当然方法的重命名我们一般都可以通过 NS_SWIFT_NAME 来指定)

参考链接

How to call an Objective-C singleton from Swift?

Objective-C 和 Swift 混编项目的小 Tips(一)相关推荐

  1. xcode12.3 swift 桥接文件_OC与Swift混编项目迁移到Swift4.2小记

    OC与Swift混编项目迁移到Swift4.2小记 前言 自从Xcode10正式版发布之后, 先吃螃蟹的朋友赞叹了Dark Mode的惊艳, 同时也报告说, 打包上传到APPStroe后, 监测到线上 ...

  2. swift调用oc_OC与Swift混编,三种场景的实现方式

    多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...

  3. 网易漫画Swift混编实践

    \ 本文为『移动前线』群在4月8日的分享总结整理而成,转载请注明来自『移动开发前线』公众号.\ 嘉宾介绍 \ 胡波,来自于网易杭州研究院,之前在网易杭研移动应用部参与网易公开课/网易看游戏/网易云阅读 ...

  4. 京东App Swift 混编及组件化落地

    背景 自 Swift 诞生以来,逐步见证其从饱受诟病到日渐完善.在苹果的全力推动下,潜移默化地把开发支持中心从 Objective-C 转向 Swift,在业界的呼声也越演越烈.当我们相继迎来 ABI ...

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

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

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

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

  7. OC与Swift混编 注意事项

    前言 随着Swift发展, 很多新的项目开始使用Swift作为首选语言. Swift语言以其简洁.快速.安全的特点获得了一大波粉丝,我也是其中之一. 项目背景:公司一些旧项目大都使用OC编写, 运营中 ...

  8. oc与swift混编教程

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

  9. swift混编oc碰到的问题

    在swift中混编苹果官方的Reachability OC文件. 因为swift工程的target是生成framework而非app,framework中调用oc与app中使用桥接文件还不一样,参考: ...

最新文章

  1. 报Java面授班有哪些优势
  2. Java构造函数的使用_java中构造函数的使用方法
  3. Tribonacci(泰波那契)数列前n项和的求解问题
  4. Quake3中的绝对值函数
  5. EF修改对象里面的值。。。(对象字段多的时候)
  6. Zookeeper与paxos算法
  7. C++后台开发需要什么?
  8. springmvc controller接收前端发送数组
  9. linux下查找某个目录下包含某个字符串的文件
  10. shell高级-----正则表达式
  11. ENRIE:知识图谱与BERT相结合,为语言模型赋能助力
  12. 有哪些网站用爬虫爬取能得到很有价值的数据?
  13. QT6安装教程(兼容QT5、QT4)
  14. Matlab如何多行添加注释和取消注释
  15. 系统测试缺陷检出密度越大越好吗?
  16. mac分区数据恢复|mac分区后数据丢失怎么恢复?
  17. springboot 实现长链接转短链接
  18. CodeForces 643 D.Bearish Fanpages(set+multiset)
  19. 《网络安全等级保护基本要求》(GB/T 22239-2019)标准解读
  20. Can#39;t locate Tk.pm

热门文章

  1. boost::int64_t模块int64 范围的测试程序
  2. boost::callable_traits添加member左值引用
  3. Boost:Porthopper服务测试程序
  4. DCMTK:OFStandard中base64代码的测试程序
  5. DCMTK:测试DICOM RT类的读写方法
  6. VTK:PolyData之ExtractSelectionOriginalId
  7. QML Imports声明
  8. Qt Creator构建Web应用程序
  9. C++shell sort希尔排序的实现算法之一(附完整源码)
  10. QT的QFile类的使用