带有默认参数的 Swift 选择器

har*_*ios 3 unrecognized-selector swift

我在这里编写简单的代码

self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: Selector("cancelClick"))
Run Code Online (Sandbox Code Playgroud)

实际功能

func cancelClick(isAlert:String = "yes"){
    self.dismissViewControllerAnimated(true, completion: { () -> Void in

        if isAlert == "yes" {
            Functions.displayAlert("called")
        }
    })
 }
Run Code Online (Sandbox Code Playgroud)
  1. self.cancelClick() - 工作,但如果我没有通过参数
  2. self.cancelClick(isAlert:"no") - 坠毁

那么如果我必须在默认参数中传递参数,我的选择器应该是什么Selector("cancelClick")Selector("cancelClick:")但都尝试过但没有运气。

mat*_*att 5

问题是参数不是由你决定的。它始终是按钮(“发件人”),这是它唯一可以做到的。

换句话说,如果你想让这个函数有一个参数,那么无论如何你需要将你的选择器字符串设置为"cancelClick:"- 冒号意味着它需要一个参数。但该参数必须是按钮:

func cancelClick(bbi:UIBarButtonItem?) {
Run Code Online (Sandbox Code Playgroud)

但是,您会注意到我巧妙地将此 UIBarButtonItem 参数设置为 Optional。你认为我为什么这样做?因为现在你可以直接调用并传nil:

self.cancelClick(nil)
Run Code Online (Sandbox Code Playgroud)

因此,cancelClick:现在有办法知道调用是来自点击按钮还是直接调用 - 如果bbi不是 nil,则按钮被点击;如果bbi nil,则直接从代码中调用我们。偷偷摸摸,嗯?

另一种偷偷摸摸的方法是将参数设为 AnyObject:

func cancelClick(sender:AnyObject) {
Run Code Online (Sandbox Code Playgroud)

这样做的好处在于您可以使用任何类型的类实例调用它。cancelClick可以检查sender. 如果它是一个 UIBarButtonItem( sender is UIBarButtonItem),那么我们通过点击按钮被调用。否则,如果在代码中调用,您可以传入字符串或此函数可能准备处理的任何其他内容。