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")
        }
    })
 }
  1. self.cancelClick() - 有效但如果我没有通过参数
  2. 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),那么我们通过点击按钮被调用。否则,如果在代码中调用,您可以传入字符串或此函数可能准备处理的任何其他内容。