Objective-C 和 Swift 混编项目的小 Tips(一)

本文主要闲聊一些 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?

时间: 2024-10-08 08:53:42

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

iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

Swift 2.0和Objective-C2.0混编之第三方框架的使用 swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引入了多种新功能,使得编程工作更加简便,灵活! 2015年6月9日苹果又一次给所有开发之者带来了一个惊喜,那就是今年年底swift讲开源,者队iOS开发着来说无疑是一个值得兴奋的消息,可是就在这短短的几个月里面swift吸引了越来

OC跟Swift混编

OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue  独立博客:http://mengxiangyue.com 最近公司的项目开始计划使用Swift,由于原先的工程都是使用OC编写的,不可能一下全部转换成Swift,所以采用OC与Swift混编的方式是最好的选择.这篇文章只是一个简单的介绍,并没有太高深的知识. 我新建了一个演示的OC工程,当然你可以使用你已经存在的OC的工程.如果我们想要在OC工程

[ios][swift]swift混编

参考:http://www.tuicool.com/articles/QZNrErM 即使你尽量用Swift编写iOS程序,难免会遇到部分算法是用C++语言编写的.那你只能去问问”度娘“或“狗哥”怎么用 Swift 调用C++算法. 一,C,C++, Objective-C,Swift有什么关系,还有什么是混编 -.-? 1. 当然是兄弟关系,虽然Objective-C是扩充C的 面向对象 编程语言,C++是在C语言的基础上开发的一种通用 编程语言 .Swift是由苹果公司推出有意让其与Obje

obeject-c 与 swift 混编

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } span.s1 { font: 12.0px "Helvetica Neue" } span.s2 {

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

swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合使用的情况. 为了演示.先准备两个类 第一个是swift语言写的类,文件名为 act.swift import Foundation class Act : NSObject { func hasAct(tag:Int) -> String { swit

Swift语言学习之OC和Swift混编

本文转自http://www.helloswift.com.cn/swiftbase/2015/0112/3469.html iOS OC和Swift混编 1.创建一个swift或者oc的工程:我这里是创建的Swift语言的工程,工程名SwiftTest 2.在工程中代码目录下创建一个oc的类,选择oc语言, 会出一个对话框,选择YES          3.这时会在工程里看到下图这样一个头文件           4.在这个头文件里添加你的OC文件的.h文件,就可以在任意swift文件中自行调

关于oc和swift混编 框架framework时 只能在真机运行或只能在模拟器单独运行的解决方案

问题描述: 关于oc和swift混编 框架framework时 只能在真机运行或只能在模拟器单独运行的解决方案. 问题提供者:by 走跑 解决方案: 首先制作swift版本的framework(Cocoa Touch Framework)取名FirstMixed 1. 工程里面新建一个SwiftView.swift文件,继承UIView,class必须是public修饰 2. 生成真机和模拟器通用的FirstMixed.framework参考这篇文章的制作通用动态库部分,这里面有教如何生成真机和

OC+swift混编

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合

IOS --- OC与Swift混编

swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合使用的情况. 为了演示.先准备两个类 第一个是swift语言写的类,文件名为 act.swift   [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 import Foundation    class Act : NSO