swift3.0解疑@objc

Posted ZHZMAREN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift3.0解疑@objc相关的知识,希望对你有一定的参考价值。

根本问题要追到OC——swift互调用的点上,在OC使用的过程中我们都知道是基于运行时的,那么在Swift使用过程中,因为swift追求性能所以就不可能在运行时去查找这个类。 也就是说 Swift 类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找,而可以直接使用。那么在Swift调用OC时没有问题,如果OC调用swift代码的时候怎么办呢??

解决起来也很简单,在 Swift 类型文件中,我们可以将需要暴露给 Objective-C 使用的任何地方 (包括类,属性和方法等) 的声明前面加上@objc 修饰符。注意这个步骤只需要对那些不是继承自 NSObject 的类型进行,如果你用 Swift 写的 class 是继承自 NSObject 的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc。这就是说,对一个 NSObject 的子类,你只需要导入相应的头文件就可以在 Objective-C 里使用这个类了。

一句话,如果你是在swift中自定义的一个类而不是NSObject的子类,那么你就必须在class前缀加上@objc;


@objc 修饰符的另一个作用是为 Objective-C 侧重新声明方法或者变量的名字。虽然绝大部分时候自动转换的方法名已经足够好用 (比如会将 Swift 中类似 init(name: String) 的方法转换成 -initWithName:(NSString *)name 这样),但是有时候我们还是期望 Objective-C 里使用和 Swift 中不一样的方法名或者类的名字,比如 Swift 里这样的一个类:


那么!!!

这样,我们在 Objective-C 里就能调用 [[MyClass new] greeting:@"XiaoMing"] 这样的代码了 (虽然比起原来一点都不好玩了)。另外,正如上面所说的以及在 Selector 一节中所提到的,即使是NSObject 的子类,Swift 也不会在被标记为 private 的方法或成员上自动加 @objc,以保证尽量不使用动态派发来提高代码执行效率。如果我们确定使用这些内容的动态特性的话,我们需要手动给它们加上 @objc 修饰。

详情:tips

以上是关于swift3.0解疑@objc的主要内容,如果未能解决你的问题,请参考以下文章

C#初识--名词解疑

(细节控)swift3.0与融云IMKIT开发问题(一部分) override func onSelectedTableRow Method does not override any method

使用 OBJC 在 Mac 上录制音频

[OC学习笔记]启动流程(objc部分)

[OC学习笔记]启动流程(objc部分)

Swift3.0语言教程比较判断字符串