最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[已解决]Swift 中如何实现Object-C的respondsToSelector

Swift crifan 7383浏览 0评论

[背景]

折腾:

[已解决]如何把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 

即可。

转载请注明:在路上 » [已解决]Swift 中如何实现Object-C的respondsToSelector

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
84 queries in 0.170 seconds, using 21.99MB memory