在swift的ViewController中写了如下代码:
func first () {
print("第一个方法")
}
func second () {
print("第second个方法")
}
overridefunc viewDidLoad() {
super.viewDidLoad()
let firstMethod =class_getInstanceMethod(self.classForCoder,#selector(ViewController.first))
let secondMethod =class_getInstanceMethod(self.classForCoder,#selector(ViewController.second))
method_exchangeImplementations(firstMethod, secondMethod)
self.first()
}
运行结果:第一个方法。发现没有达到我们预期的目的,同样的代码用OC实现如下:
-(void) first {
NSLog(@"第一个方法");
}
-(void) second {
NSLog(@"第second个方法");
}
- (void)viewDidLoad {
[superviewDidLoad];
Method first =class_getInstanceMethod([selfclass],@selector(first));
Method second =class_getInstanceMethod([selfclass],@selector(second));
method_exchangeImplementations(first, second);
[selffirst];
}
运行结果:第second个方法。达到了我们预期的目的。为什么在swift中方法交换失败了呢,试着把上面方法交换的代码放在initialize方法中,发现结果还是一样。然后又试着和viewWillAppear方法交换,发现系统自动调用时,方法是交换过的,但是,自己主动调用viewWillAppear方法,或者交换的方法,都还是原来的实现,没有达到交换的目的。
因为在Swift代码中已经没有了Objective-C的运行时消息机制, 在代码编译时即确定了其实际调用的方法. 所以纯粹的Swift类和对象没有办法使用runtime, 更不存在method swizzling. 那是不是在swift中就不能使用runtime了呢?答案肯定是可以的。要使用runtime,我们需要在想要使用runtime的方法或者属性前面加上dynamic关键字。