Swift 带默认参数的选择器
Swift Selector with default argument
我在这里写了简单的代码
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: Selector("cancelClick"))
实际函数
func cancelClick(isAlert:String = "yes"){
self.dismissViewControllerAnimated(true, completion: { () -> Void in
if isAlert == "yes" {
Functions.displayAlert("called")
}
})
}
self.cancelClick()
- 有效但如果我没有通过参数
self.cancelClick(isAlert:"no")
- 坠毁
如果我必须在默认参数中传递参数,那么我的选择器应该是什么
Selector("cancelClick")
和 Selector("cancelClick:")
都试过了,但没有成功。
不要使用 Selector("cancelClick:")
,请尝试只使用 "cancelClick:"
和冒号,这样您就可以传递参数。
正如 Matt 所说,您必须传递的参数是 sender
(按钮)本身。
问题是参数不由你决定。它始终是按钮("sender"),这是唯一的东西。
换句话说,如果你想让这个函数有一个参数,那么无论如何你都需要将你的选择器字符串设置为 "cancelClick:"
- 冒号意味着它需要一个参数。但是那个参数必须是按钮:
func cancelClick(bbi:UIBarButtonItem?) {
但是,您会注意到我巧妙地将此 UIBarButtonItem 参数设为可选。你认为我为什么那样做?因为现在你可以 also 直接调用它并传递 nil:
self.cancelClick(nil)
因此,cancelClick:
现在有办法知道调用是来自点击按钮还是直接调用 - 如果 bbi
不为零,则点击了按钮;如果 bbi
是 nil,我们直接从代码调用。偷偷摸摸的,嗯?
另一种偷偷摸摸的方法是使参数成为 AnyObject:
func cancelClick(sender:AnyObject) {
它的美妙之处在于您可以使用 任何 类型的 class 实例来调用它。 cancelClick
可以检查 sender
的类型。如果它是一个 UIBarButtonItem (sender is UIBarButtonItem
),那么我们通过点击按钮被调用。否则,如果在代码中调用,您可以传入字符串或此函数可能准备处理的任何其他内容。
我在这里写了简单的代码
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: Selector("cancelClick"))
实际函数
func cancelClick(isAlert:String = "yes"){
self.dismissViewControllerAnimated(true, completion: { () -> Void in
if isAlert == "yes" {
Functions.displayAlert("called")
}
})
}
self.cancelClick()
- 有效但如果我没有通过参数self.cancelClick(isAlert:"no")
- 坠毁
如果我必须在默认参数中传递参数,那么我的选择器应该是什么
Selector("cancelClick")
和 Selector("cancelClick:")
都试过了,但没有成功。
不要使用 Selector("cancelClick:")
,请尝试只使用 "cancelClick:"
和冒号,这样您就可以传递参数。
正如 Matt 所说,您必须传递的参数是 sender
(按钮)本身。
问题是参数不由你决定。它始终是按钮("sender"),这是唯一的东西。
换句话说,如果你想让这个函数有一个参数,那么无论如何你都需要将你的选择器字符串设置为 "cancelClick:"
- 冒号意味着它需要一个参数。但是那个参数必须是按钮:
func cancelClick(bbi:UIBarButtonItem?) {
但是,您会注意到我巧妙地将此 UIBarButtonItem 参数设为可选。你认为我为什么那样做?因为现在你可以 also 直接调用它并传递 nil:
self.cancelClick(nil)
因此,cancelClick:
现在有办法知道调用是来自点击按钮还是直接调用 - 如果 bbi
不为零,则点击了按钮;如果 bbi
是 nil,我们直接从代码调用。偷偷摸摸的,嗯?
另一种偷偷摸摸的方法是使参数成为 AnyObject:
func cancelClick(sender:AnyObject) {
它的美妙之处在于您可以使用 任何 类型的 class 实例来调用它。 cancelClick
可以检查 sender
的类型。如果它是一个 UIBarButtonItem (sender is UIBarButtonItem
),那么我们通过点击按钮被调用。否则,如果在代码中调用,您可以传入字符串或此函数可能准备处理的任何其他内容。