我正在将我的项目的语法转换为Swift 2.2(xCode帮助我自动完成);然而,我不理解新的#selector()语法.

例如:

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

这是 Select 器#selector(MyVC.timerCalled(_:))

_:代表什么?你能在这个 Select 器中添加其他变量吗?比如说,#MyVC.timerCalled(_:whateverVar).

非常感谢您提供有关此语法与早期版本的Swift基于字符串的实现的不同之处的一般信息.

推荐答案

括号中的位是一种机制,用于标识所需 Select 器的参数列表.

我建议你看看Swift Evolution的Generalized Naming份提案.它涵盖了许多函数的情况,这些函数只在参数标签上有所不同,需要引用它们.该文件中的示例如下:

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:)

看看这些标签是如何添加到Paren中的?

这个提议在最直接适用于你的问题的提议中发挥了作用:

Referencing the Objective-C selector of a method

在这种特殊情况下,您要引用的 Select 器是timerCalled:,它是一个没有标签的参数的函数.因此(:).下划线表示未指定标签和冒号.

Swift相关问答推荐

字符串目录不适用于SWIFT包

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

显示第二个操作紧接在另一个操作后的工作表在SwiftUI中不起作用

以编程方式使UIView居中,而不影响UIKit中其他UI类的位置

Result类型的初始值设定项失败?

为什么我的Swift app不能用xcodebuild构建,但是用XCode可以构建?

如何使一个 Reality Composer 场景中的分组对象可拖动?

使用 Async-Await 和 Vapor-Fluent 创建 CRUD 函数 - Swift 5.6

如何在 UITableView 中点击图片和标题

Swift 全局函数列表

与 SwiftUI 中的 onChange 修饰符相比,objectWillChangeSequence 的目的是什么?

数组使用偏移量对自身执行 XOR

关联满足约束时的快速协议方法

您可以在运行时访问 Picker 元素并更改它们的 colored颜色 吗

我如何从 UIAlertController 导航到新屏幕(swiftUI)

AES 加密和解密

在 Swift 4 中,如何删除基于块的 KVO 观察者?

Swift 4 Decodable - 以枚举为键的字典

使用 Swift 以编程方式自定义 UITableViewCell

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey