Swift的动态性
2016-04-16 19:38
405 查看
动态性比较重要的一点就是能够拿到某个类所有的方法、属性,我们使用如下代码来打印方法和属性列表。
纯Swift类的函数调用已经不再是Objective-c的运行时发消息,而是类似C++的vtable,在编译时就确定了调用哪个函数,所以没法通过runtime获取方法、属性。
TestSwiftVC继承自
动态性最常用的就是方法替换(Method Swizzling),将类的某个方法替换成自定义的方法,从而达到hook的作用。
对于纯Swift类(如TestASwiftClass)来说,无法通过objc runtime替换方法,因为由上面的测试可知拿不到这些方法、属性
对于继承自NSObject类(如TestSwiftVC)来说,无法通过runtime获取到的方法肯定没法替换了。那能通过runtime获取到的方法就都能被替换吗?
@objc
用来将Swift的API导出给Objective-C和Objective-C runtime使用的,如果你的类继承自Objective-c的类(如NSObject)将会自动被编译器插入@objc标识。
纯Swift类没有动态性,但在方法、属性前添加dynamic修饰可以获得动态性。
继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法、属性需要加dynamic修饰才可以获得动态性。
若方法的参数、属性类型为Swift特有、无法映射到Objective-C的类型(如Character、Tuple),则此方法、属性无法添加dynamic修饰(会编译错误)
Swift类在Objective-C中会有模块前缀
纯Swift类的函数调用已经不再是Objective-c的运行时发消息,而是类似C++的vtable,在编译时就确定了调用哪个函数,所以没法通过runtime获取方法、属性。
TestSwiftVC继承自
UIViewController,基类为
NSObject,而Swift为了兼容Objective-C,凡是继承自NSObject的类都会保留其动态性,所以我们能通过runtime拿到他的方法。
Method Swizzling
动态性最常用的就是方法替换(Method Swizzling),将类的某个方法替换成自定义的方法,从而达到hook的作用。对于纯Swift类(如TestASwiftClass)来说,无法通过objc runtime替换方法,因为由上面的测试可知拿不到这些方法、属性
对于继承自NSObject类(如TestSwiftVC)来说,无法通过runtime获取到的方法肯定没法替换了。那能通过runtime获取到的方法就都能被替换吗?
@objc
用来将Swift的API导出给Objective-C和Objective-C runtime使用的,如果你的类继承自Objective-c的类(如NSObject)将会自动被编译器插入@objc标识。
dynamic
加了@objc标识的方法、属性无法保证都会被运行时调用,
因为Swift会做静态优化。要想完全被动态调用,必须使用dynamic修饰。
使用dynamic修饰将会隐式的加上@objc标识
总结
纯Swift类没有动态性,但在方法、属性前添加dynamic修饰可以获得动态性。继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法、属性需要加dynamic修饰才可以获得动态性。
若方法的参数、属性类型为Swift特有、无法映射到Objective-C的类型(如Character、Tuple),则此方法、属性无法添加dynamic修饰(会编译错误)
Swift类在Objective-C中会有模块前缀
相关文章推荐
- Swift教程之枚举语法
- 用swift开发仪表盘控件(一)
- Swift-AES之加密解密
- Swift 添加三方库方法(手动&CocoaPods)
- Swift中出现“no such module cocoa”的错误
- OC与Swift混编
- swift新增两种类型
- swift error:Extra argument 'error' in call
- 【Swift学习】Swift编程之旅---集合类型之数组(六)
- 六种语言实现输出乘法口诀表
- Swift 版本很好的卡片切换效果基于ZLSwipeableView(类似于[陌陌点点][探探])
- 在swift中使用自带NSURLConnection请求数据
- Swift开发:弹框(UIAlertController)
- Swift 闭包表达式
- 如何用Swift实现一个好玩的弹性动画
- Swift中编写单例的正确方式
- Swift2-0基础_Deinitialization析构过程
- Swift2-0基础_Initialization(构造过程)
- Swift2-0基础_Inheritance(继承)
- Swift2-0基础_Subscripts(下标脚本)