Objective-C 的
@selector()
表达式的 Swift 等价物是 #selector()
。在 Xcode 中,Objective-C 的 @selector()
表达式将为所有可用选择器提供自动完成功能,并且选择器表达式是使用 just 选择器构建的;例如,@selector(valueForKey:)
。
在 Swift 中,Xcode 仅有时为
#selector()
表达式提供自动补全功能,我们必须使用类型显式限定选择器;例如,#selector(NSObject.value(forKey:))
。
据我所知,在 @objc 上下文中,Xcode 将允许我们构造一个
#selector()
表达式,而无需使用类型限定选择器。
例如:
@objc @objcMembers class Individual: NSObject {
func testFunc() {
let sel = #selector(value(forKey:))
}
}
是否有任何其他上下文可以使用不受类型限定的
#selector()
表达式?
不需要完全限定的选择器名称(带有类名称),即使在未用
@objc
标记的方法中也是如此。当然,选择器本身必须是 Objective-C 方法或标有 @objc
的 Swift 方法。
奇怪的是,没有任何文档显示任何没有完全限定名称的
#selector
示例,但我从不使用完全限定名称,而且它工作得很好。它的工作原理就像在 Objective-C 中一样。只要编译器可以在项目中的任何已知类上找到这样的方法,非限定选择器就可以在任何上下文中使用。
相关文档(无不合格示例):
顺便说一句 - Xcode 不会强制我使用完全限定的名称。如果我输入类似的内容:
let sel = #selector(
然后输入一个字母,例如
v
,Xcode提供了很多以v
开头的选择器,但它不包含任何类名。
另请注意,选择器名称不需要括号和参数,除非您需要消除重载方法名称之间的歧义。
举个例子,假设我们在一些 iOS 代码中有一个按钮处理程序。我们需要用于调用
addTarget
的选择器。处理程序方法可能如下所示:
@objc func buttonTapped(_ button: UIButton) {
}
以下是
#selector
的所有有效用法:
#selector(SomeClass.buttonTapped(_:))
#selector(SomeClass.buttonTapped)
#selector(buttonTapped(_:))
#selector(buttonTapped)
如果引用的选择器与
#selector
行属于同一类,您还可以在选择器名称前加上 Self.
:
#selector(Self.buttonTapped(_:))
#selector(Self.buttonTapped)
尽管似乎没有什么理由这样做。