小编典典

了解Swift 2.2选择器语法-#selector()

swift

我正在将项目的语法切换到Swift 2.2(xCode可以帮助我自动完成);但是,我不理解新#selector()语法。

举个例子:

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, 
             selector: #selector(MyVC.timerCalled(_:)), //new selector syntax!
             userInfo: nil, repeats: true)

这有选择器 #selector(MyVC.timerCalled(_:))

_:意味着什么?您可以将其他变量添加到此选择器吗?说,#MyVC.timerCalled(_:whateverVar)

与早期版本的Swift的基于字符串的实现相比,此语法有何不同的一般信息将受到极大的赞赏。


阅读 356

收藏
2020-07-07

共1个答案

小编典典

括号中的位是一种用于标识所需选择器的参数列表的机制。

我建议您查看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:是一个没有标签的参数的函数。因此(_ :)。下划线表示未指定标签和冒号。

2020-07-07