在什么情况下我们可以在 Swift 中使用不合格的 #selector() 表达式?

问题描述 投票:0回答:1

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()
表达式?

swift objective-c cocoa selector
1个回答
0
投票

不需要完全限定的选择器名称(带有类名称),即使在未用

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

尽管似乎没有什么理由这样做。

© www.soinside.com 2019 - 2024. All rights reserved.