加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

@selector()在Swift?

发布时间:2020-12-14 06:19:41 所属栏目:百科 来源:网络整理
导读:我试图在Swift中创建一个NSTimer,但我有一些麻烦。 NSTimer(timeInterval: 1,target: self,selector: test(),userInfo: nil,repeats: true) test()是同一个类中的一个函数。 我在编辑器中出现错误: Could not find an overload for ‘init’ that accepts
我试图在Swift中创建一个NSTimer,但我有一些麻烦。
NSTimer(timeInterval: 1,target: self,selector: test(),userInfo: nil,repeats: true)

test()是同一个类中的一个函数。

我在编辑器中出现错误:

Could not find an overload for ‘init’ that accepts the supplied
arguments

当我改变选择器:test()到s??elector:nil的错误消失。

我试过了:

> selector:test()
> selector:测试
> selector:选择器(test())

但没有什么工作,我找不到解决方案的参考。

Swift本身不使用选择器 – 在Objective-C中使用选择器的几种设计模式在Swift中工作方式不同。 (例如,对协议类型使用可选链接,或者使用/作为测试,而不是respondToSelector :,并在任何地方使用closures,而不是performSelector:以获得更好的类型/内存安全性)。

但仍有一些重要的基于ObjC的API使用选择器,包括定时器和目标/操作模式。 Swift提供了使用这些的选择器类型。 (Swift自动使用它代替ObjC的SEL类型。)

在Swift 2.2(Xcode 7.3)和更高版本(包括Swift 3 / Xcode 8)中:

您可以使用#selector表达式从Swift函数类型构造一个Selector。

let timer = Timer(timeInterval: 1,target: object,selector: #selector(MyClass.test),repeats: false)
button.addTarget(object,action: #selector(MyClass.buttonTapped),for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),with: button,with: otherButton)

这个方法的伟大的事情?函数引用由Swift编译器检查,因此您可以将#selector表达式仅与实际存在且有资格用作选择器的类/方法对组合使用(请参阅下面的“选择器可用性”)。您还可以根据需要,根据the Swift 2.2+ rules for function-type naming自由地使您的功能参考。

(这实际上是对ObjC的@selector()指令的改进,因为编译器的-Wundeclared-selector检查只验证命名的选择器存在。你传递给#selector的Swift函数引用检查存在,类中的成员资格和类型签名。)

对于传递给#selector表达式的函数引用,还有一些额外的警告:

>使用前面提到的syntax for function references(例如insertSubview(_:at

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读