[背景]
折腾:
[已解决]如何把Object-C中的protocol和delegate转为Swift代码
期间,需要去搞懂,最原始的ObjC的代码:
if ([self.delegate respondsToSelector:@selector(mh_tabBarController:shouldSelectViewController:atIndex:)])
改为:
if self.delegate?.record_tabBarController(<#T##tabBarController: RecordTabBarController##RecordTabBarController#>, didSelectViewController: <#T##UIViewController#>, atIndex: <#T##UInt#>) .respondsToSelector(@selector(mh_tabBarController.shouldSelectViewController(atIndex))) {
中的respondsToSelector,如何转换为Swift代码。
[折腾过程]
1.搜:
swift oc respondsToSelector
参考:
What is the swift equivalent of respondsToSelector? – Stack Overflow
Swift alternative to respondsToSelector: – Stack Overflow
Russ Bishop – Swift: respondsToSelector?
有点看懂了:
之前ObjC中,对于一个未知类型的对象,是否有对应的函数
-》是否能否响应对应的函数=?选择器
-》才去在调用对应的函数之前,去使用respondsToSelector问问对象是否支持这个函数,能否响应这个函数的
比如:
if([obj respondsToSelector:@selector(fizzyWizzle)]) { [obj fizzyWizzle]; }
而Swift中,其实就变得很简单,就是用optional:
someObj.someFunction?()
然后如果本书someObj支持这个函数,有这个函数,有这个方法,则就可以继续调用someFunction
如果没有,则本书也不会继续执行
完全符合ObjC中的respondsToSelector的逻辑
当然,如果本身这个变量对象(尤其经常是个delegate),则可以去用:
var delegate: SomeDelegate? @objc protocol SomeDelegate { optional fun someOptionalFunc(xxx) } delegate?.someOptionalFunc(xxx)
不过,在Swift中,如果想要检查已有的API(是否存在)的话,也可以写成:
var a = TestA() if a.respondsToSelector("someMethod") { a.someMethod() }
去判断API是否存在。
然后就去改代码,结果又出现其他问题:
[已解决]Swift中用delegate的方法出错:Optional type _?? cannot be used as a boolean test for != nil instead
[总结]
此处把ObjC中的respondsToSelector改为了swift中的optional的值,即可去调用对应的(此处的delegate的)函数了,ObjC代码:
if ([self.delegate respondsToSelector:@selector(mh_tabBarController:shouldSelectViewController:atIndex:)])
最终改为:
if delegate?.shouldSelectViewController(self, atIndex: newSelectedIndex) == true
即可。