我正在将项目的语法切换到Swift 2.2(xCode可以帮助我自动完成);但是,我不理解新#selector()语法。
#selector()
举个例子:
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(MyVC.timerCalled(_:)), //new selector syntax! userInfo: nil, repeats: true)
这有选择器 #selector(MyVC.timerCalled(_:))
#selector(MyVC.timerCalled(_:))
这_:意味着什么?您可以将其他变量添加到此选择器吗?说,#MyVC.timerCalled(_:whateverVar)。
_:
#MyVC.timerCalled(_:whateverVar)
与早期版本的Swift的基于字符串的实现相比,此语法有何不同的一般信息将受到极大的赞赏。
括号中的位是一种用于标识所需选择器的参数列表的机制。
我建议您查看Swift Evolution 的“ 通用命名”建议。它涵盖了您具有许多功能的情况,这些功能仅因其参数标签不同而需要引用它们。该文档中的示例为:
extension UIView { func insertSubview(view: UIView, at index: Int) func insertSubview(view: UIView, aboveSubview siblingSubview: UIView) func insertSubview(view: UIView, belowSubview siblingSubview: UIView) }
如果要获取其中之一的函数值,则结果不明确:
let fn = someView.insertSubview // ambiguous: could be any of the three methods
实现的解决方案是在没有任何类型信息的代码中添加参数标签,该代码会生成要消除歧义的函数值:
let fn = someView.insertSubview(_:at:) let fn1 = someView.insertSubview(_:aboveSubview:)
看看如何在标签中添加标签?
该建议在最直接适用于您的问题的建议中发挥了作用:
引用方法的Objective-C选择器
在这种特殊情况下,您要引用的选择器timerCalled:是一个没有标签的参数的函数。因此(_ :)。下划线表示未指定标签和冒号。
timerCalled: