Swift 默认参数和选择器语法

Swift default parameter & Selector Syntax

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

func myFunc(foo: Bool = true) { }

我正在尝试找出正确的 Selector 语法,因为我将其添加为 UIRefreshControl

的目标
 self.refreshControl.addTarget(self, action: Selector("myFunc"), forControlEvents: UIControlEvents.ValueChanged)

我已经尝试了 Selector("myFunc")Selector("myFunc:") - 都因无效的选择器错误而崩溃。

搜索了网络,但没有提出任何解决方案。有人可以帮忙吗?谢谢

您遇到了崩溃,因为它需要一个不同的参数。 'addTarget' 期望得到一个唯一参数(如果有的话)是 AnyObject(或者可能是 UIView)的函数,而不是 Bool

我们正在尝试向 UI 元素添加一个动作。如果我们尝试将一个控件从我们的界面构建器文件连接到我们的视图控制器 class:

,请考虑 Xcode 提供给我们的选项

与您使用的方法非常相似,Interface Builder 要求我们提供多项内容。

  • 界面生成器知道哪个控件是发送者(我们从哪里启动 Ctrl+拖动...这等同于您的 self.refreshControl,这就是我们在 addTarget 上调用的)。
  • 界面生成器知道目标 class 是什么(我们按 Ctrl+拖动到它)。
  • 界面构建器要求我们提供我们将要创建的方法的名称。在您的情况下,您在编写方法时选择了它。
  • 界面生成器询问我们应该如何传递发送者。在按钮的情况下,它为我们提供了 AnyObject(默认)或 UIButton 选项。在 UIRefreshControl 的情况下,选项将是 AnyObjectUIRefreshControl。这作为 "sender" 对象传递。
  • 界面构建器询问我们应该为哪些事件调用此方法(就像 addTarget 方法一样)。

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

这里有三个选项。

我们可以不传递任何参数,在这种情况下,我们会有一个如下所示的方法:

func myFunc() {

}

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

func myFunc(sender: AnyObject) {

}

但是 sender 的类型会因我们实际尝试发送的内容而异。

或者我们可以传递发送者和事件类型(如果多个事件绑定到同一个方法时很有用):

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

}

如果通过 Interface builder 完成,我们也会有一个 @IBAction 在开头突出,但这不是我们在您的示例中所做的。

现在,如果这是 Objective-C,我们的方法将如下所示:

- (void)myFunc:(id)sender {

}

并且 Objective-C 不支持重载,因此它不允许在同一个 class 中使用另一个函数,如下所示:

- (void)myFunc:(BOOL)foo {

}

不能有两个同名的方法。

然而,

Swift 确实支持方法重载,因此,同样的 class 可以 具有以下两种方法:

func myFunc(foo: AnyObject) {

}

func myFunc(foo: Bool) {

}

这些在Swift眼里是完全不同的方法,完全没问题。

然而,您的代码只有后者。一个名为 myFunc 的方法,它接受一个 Bool 参数。

当您尝试添加 addTarget: 方法时,Swift 正在寻找一个具有您给它的名称 (myFunc:) 的方法,它可以接受 UIRefreshControl争论。它找不到过载。

实际上,您得到的错误与此错误有点相同:

重点是,Swift 找不到可以接受 UIRefreshControl 参数的名为 myFunc: 的方法。