我们知道,在oc里,因为oc具有运行时消息机制,所以可以使用runtime来进行一些黑魔法的操作。但是在swift里,因为swift本身是一门静态语音,所以是无法通过使用runtme机制来做一些操作的。先来看个例子:
1 | class testSwiftClass{ |
运行一下,会发现count打印为0!
这是为啥呢,因为我们创建的testSwiftClass
是一个纯Swift类,所以我们是没法对其用runtime来做操作的。那么难道swift里没法使用runtime了吗?当然是肯定能用的。我们可以在你要获取的属性(函数同理)前用@objc dynamic
修饰即可(某些情况下加上@objc
修饰即可,比如这里的两个属性前加上@objc
修饰的效果和@objc dynamic
修饰的效果一致,不过为了安全性,建议全加)
1 | class testSwiftClass{ |
打印输出如下:
1 | method == ISMan |
为什么加上@objc dynamic
就有runtime机制了呢?swift不是静态语音吗?
首先有@objc
这个关键字,它是用来将swift的API暴露给oc和runtime使用的,但加了这标识符的属性、方法无法保证都会被运行时调用,因为swift会做静态优化,想要完全被声明成动态调用,必须使用dynamic
标识符修饰。
再举个例子:
1 | dynamic func testOne() { |
打印输出:
1 | 这是第二个方法 |