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 慢,因为它分层结构的在它的上面?
@objc 关键字怎么了?
action
的参数 addTarget
是 Selector
,你可以想像为目的 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 运行时交互。 苹果工程师们聪明,工作使这快速、 高效。 效率的这不是你应该担心的事情,尤其是对用户界面方法,才可称为当用户按下一个按钮 (即不数以百万计的第二次)。