在OC中协议的可选方法是否实现的判断可以通过
self.delegate.responseToSelector(@selector(method))
来进行判断,如果代理对象实现了method,则执行method,如果代理对象没有实现,则不执行,如果不进行判断,在代理对象没有实现method的时候,程序会因为找不到方法二崩溃
if(self.delegate.responseToSelector(@selector(method)){[self.delegate method]}
这是oc中对可选协议方法的判断
在编写swift协议中自定义了可选方法之后的判断则可以利用swift的可空链直接由系统进行判断,不用自己写responseToSelector方法来进行代理对象是否实现的判断:
@objc protocol xxxdelegate { optional func method()};
定义一个协议,并给其添加一个可选的方法
在类中使用的时候则可以直接通过可空链判断:
delegate?.method?()
对于可空链,第一个问号会判断delegate是否存在,如果不存在,则直接返回nil,如果存在,则调用method,method后的问号,会直接对该方法进行判断,如果代理对象实现了method,则调用method在代理对象中的实现,如果代理对象没有实现该可选的method,则返回空,并且不会造成程序崩溃。
一开始用swift写协议的可选方法时,以为对可选方法的实现判断应该和oc中一样,但是在实际操作中发现delegate不能调用responseToSelector方法,之后发现其直接通过可空链进行方法是否实现的判断,在swift中的optional类型,初学使用时会感觉非常麻烦,很多地方都需要考虑拆包,而且在实际编程中发现强制拆包虽然方便,但是会造成很多未知的不可控问题,很多时候往往需要用if let语句进行拆包,感觉反而使代码变得很冗余,但是随着深入的使用,发现swift的optional类型其实在很多场景都提供了良好的链式编程环境,反而使代码写起来更加流畅,且阅读代码更加容易。
网友评论