Swift默认参数&选择器语法

时间:2015-03-01 13:56:25

标签: ios swift syntax selector

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

func myFunc(foo: Bool = true) { }

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

enter image description here

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

  • 接口构建器知道哪个控件是发件人(我们从哪里开始Ctrl +拖动...这相当于我们正在调用self.refreshControl的{​​{1}}。
  • 接口构建器知道目标是哪个类(我们按Ctrl +拖动它)。
  • 接口构建器会询问我们即将创建的方法的名称。在您的情况下,您在编写方法时选择了它。
  • 接口构建器询问我们应如何传递发件人。在按钮的情况下,它为我们提供addTarget(默认)或AnyObject选项。如果是UIButton,则选项为UIRefreshControlAnyObject。这是作为“发件人”对象传递的。
  • 接口构建器询问我们应该调用此方法的事件(就像UIRefreshControl方法一样)。

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

enter image description here

我们在这里有三个选择。

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

addTarget

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

func myFunc() {

}

func myFunc(sender: AnyObject) { } 的类型会因我们实际发送的内容而异。

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

sender

如果通过“界面”构建器完成,我们在开始时也会遇到func myFunc(sender: AnyObject, forEvent event: UIEvent) { } ,但这不是我们在您的示例中所做的。

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

@IBAction

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

- (void)myFunc:(id)sender {

}

你不能有两个同名的方法。

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

- (void)myFunc:(BOOL)foo {

}

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

但是,您的代码只有后者。一个名为func myFunc(foo: AnyObject) { } func myFunc(foo: Bool) { } 的方法,它接受一个Bool参数。

当您尝试添加myFunc方法时,Swift正在寻找一个方法,其中包含您提供的名称(addTarget:),该方法可以接受myFunc:参数。它无法找到过载。

实际上,您获得的错误与此错误相同:

enter image description here

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

答案 1 :(得分:2)

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