博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C 和 Swift 混编项目的小 Tips(一)
阅读量:6985 次
发布时间:2019-06-27

本文共 2826 字,大约阅读时间需要 9 分钟。

本文主要闲聊一些 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 来指定)

参考链接

转载地址:http://ksqpl.baihongyu.com/

你可能感兴趣的文章
【转载】大整数相乘
查看>>
Android 小项目之--Mini音乐播放器【简单版】(附源码)
查看>>
Delphi判断文件是否正在被使用
查看>>
TaskAsyncHelper
查看>>
知之为知之,不知为不知。
查看>>
设计模式6大原则
查看>>
C# WinForm 文件上传下载
查看>>
[转载]日历设计之重复事件规则设计
查看>>
HTTP协议详解(真的很经典)
查看>>
(转)什么是云计算
查看>>
Linux性能监控命令——sar
查看>>
使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之二...
查看>>
视差滚动(Parallax Scrolling)效果的原理和实现
查看>>
咏南中间件支持DELPHI低版本开发的两层程序平稳升级到三层
查看>>
带监督的文本分类算法FastText
查看>>
新书推荐:细说PHP(含样章试读)
查看>>
《黑客防线》2010合订本(下半年)
查看>>
intel I7平台Win7 x64 下wpf、silverlight 与aero特效动画缓慢故障排除一则
查看>>
shell常识总结
查看>>
内存池版本1--单线程-固定大小专为某类设计的内存池
查看>>