Swift默认参数和选择器语法

cud*_*mer 5 syntax selector ios swift

我有一个带默认参数的函数:

func myFunc(foo: Bool = true) { }
Run Code Online (Sandbox Code Playgroud)

我正在尝试找出它的正确Selector语法,因为我将它添加为a的目标UIRefreshControl

 self.refreshControl.addTarget(self, action: Selector("myFunc"), forControlEvents: UIControlEvents.ValueChanged)
Run Code Online (Sandbox Code Playgroud)

我曾经尝试都Selector("myFunc")Selector("myFunc:")-都崩溃与无效选择错误.

有网络冲刷但没有解决方案被抛出.有人可以帮忙吗?谢谢

nhg*_*rif 5

我们正在尝试向UI元素添加操作.如果我们尝试将控件从接口构建器文件连接到视图控制器类,请考虑Xcode向我们提供的选项:

在此输入图像描述

与您使用的方法非常相似,Interface Builder正在向我们询问多种内容.

  • 界面构建器知道哪个控件是发件人(我们从哪里开始Ctrl +拖动...这等同于self.refreshControl我们正在调用的那个addTarget).
  • 接口构建器知道目标是哪个类(我们按Ctrl +拖动它).
  • 接口构建器询问我们即将创建的方法的名称.在您的情况下,您在编写方法时选择了该选项.
  • 接口构建器询问我们应该如何传递发送方.在按钮的情况下,它给我们选择AnyObject(默认)或UIButton.在a的情况下UIRefreshControl,选项将是AnyObjectUIRefreshControl.这是作为"发件人"对象传递的.
  • 接口构建器询问我们应该调用此方法的事件(就像addTarget方法一样).

最后,Interface builder询问我们应该传递什么样的参数:

在此输入图像描述

我们这里有三个选择.

我们可以不传递任何参数,在这种情况下,我们有一个看起来像这样的方法:

func myFunc() {

}
Run Code Online (Sandbox Code Playgroud)

或者我们可以传递"发件人",在这种情况下,方法将如下所示:

func myFunc(sender: AnyObject) {

}
Run Code Online (Sandbox Code Playgroud)

但是这种类型sender会根据我们实际发送的内容而有所不同.

或者我们可以传递发件人和事件类型(如果多个事件绑定到同一个方法,则非常有用):

func myFunc(sender: AnyObject, forEvent event: UIEvent) {

}
Run Code Online (Sandbox Code Playgroud)

如果通过"接口"构建器完成,我们@IBAction在开始时也会遇到问题,但这不是我们在您的示例中所做的.

现在,如果这是Objective-C,我们的方法看起来像这样:

- (void)myFunc:(id)sender {

}
Run Code Online (Sandbox Code Playgroud)

并且Objective-C不支持重载,因此它不允许同一类中的另一个函数看起来像这样:

- (void)myFunc:(BOOL)foo {

}
Run Code Online (Sandbox Code Playgroud)

您不能有两个具有相同名称的方法.

但是,Swift确实支持方法重载,因此,同一个类可以使用以下两种方法:

func myFunc(foo: AnyObject) {

}

func myFunc(foo: Bool) {

}
Run Code Online (Sandbox Code Playgroud)

这些是Swift眼中完全不同的方法,非常精细.

但是,您的代码只有后者.一个叫做myFuncBool参数的方法.

当你尝试添加addTarget:方法时,Swift正在寻找一个方法,你给它的名字(myFunc:)可以接受一个UIRefreshControl参数.它无法找到过载.

实际上,您获得的错误与此错误类似:

在此输入图像描述

关键是,Swift找不到一个myFunc:可以接受UIRefreshControl参数的方法.


Sha*_*hai 2

您会发生崩溃,因为它需要不同的参数。“addTarget”期望获得一个函数,该函数的唯一参数(如果有)是 AnyObject(或者可能是 UIView),而不是 Bool