Swift 中使用runtime交换方法实现

在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关键字。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值