什么是 Swift 我将目标添加到 UIButton 的时候在幕后做?

标签: Swift UIButton
发布时间: 2017/3/6 23:00:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
let button = UIButton()
button.addTarget(self, action: #selector(MyClass.handleButton(_:)), forControlEvents: .TouchUpInside)

@objc private func handleButton(sender: UIButton!)
{
}

我还处于开始与 Swift ,所以这可能是种基本,但是与什么 @objc 关键字、 下划线中的 MyClass.handleButton(_:) ,和 handleButton 的参数后感叹?我收集旧的框架是在 obj c Swift 链接反对它在某种程度上,但我不明白语法。有更好的办法,可以以编程方式在设置按钮 swift 吗?不会 swift 在这种情况下会比 obj c 慢,因为它分层结构的在它的上面?

解决方法 1:

@objc 关键字怎么了?

action的参数 addTargetSelector ,你可以想像为目的 C 函数的指针。 为了得到一个选择器函数,此函数必须对可见 Objective-C 因为它将由苹果的框架所写的目的 C.调用 有两种方法可以做到这一点︰ 1) 或者您的类必须是类的子类 NSObject 或从继承的类继承 NSObject (像 UIViewController ),或 2) 您需要添加 @objc 归因于 Swift 功能使 Swift 目的 C.方法

在 MyClass.handleButton(_:) 中下划线?

下划线表示第一个参数为 handleButton 。 在objective-c,第一个参数不命名的所以这代表在 Swift_ 这是一个通配符含义的参数不命名为。

MyClass.handleButton(_:)指定调用的函数 handleButton 类中定义的 MyClass ,采用一个参数。

如果你 handleButton 采取了两个参数,像这样︰

@objc func handleButton(button: UIButton, forEvent event: UIEvent) {
}

然后选择器本来 #selector(MyClass.handleButton(_:forEvent:)) 显示, handleButton 使用两个参数与第二个命名为 forEvent

你可以逃脱时您指定选择器指定小于的完整名称。 你可以离开的类名︰

#selector(handleButton(_:))

和编译器将查找在您当前类的功能。

如果只有一个 handleButton 函数在类中 (它不重载),您甚至可以离开指定参数︰

#selector(handleButton)

handleButton 的参数后感叹?

@objc private func handleButton(sender: UIButton!)
{
}

在这里, UIButton!隐式打开可选这意味着它是可选的您可以使用而无需打开它 (与 ! )。 这允许调用者传递 nil 而不是引用到 UIButton ,但这当然会崩溃随时您尝试使用 sender

就没有必要为此为可选。 你将总是传递 UIButton ,所以去掉一些不必要的 !

有更好的办法,可以以编程方式在设置按钮 Swift 吗?

不是真的,除了我已经提到的选择器的快捷方式。

不会 Swift 在这种情况下会比 obj c 慢,因为它分层结构的在它的上面?

你要向objective-c 运行时交互。 苹果工程师们聪明,工作使这快速、 高效。 效率的这不是你应该担心的事情,尤其是对用户界面方法,才可称为当用户按下一个按钮 (即不数以百万计的第二次)。

官方微信
官方QQ群
31647020