AnyObject 和 UIbutton 作为发送者有什么区别?

What's the difference between AnyObject and UIbutton as sender?

在定义 IBAction 时,Anyobject 和 UIButton 都有一个选项,两者都可以,有什么区别?

如果它是 anyObject,则它没有任何 UIButton 的属性。当您单击按钮并且 IBAction 触发时,发送者包含有关触发该操作的事物的信息。

例如,对于 UIButton,您可能希望在 IBAction 触发时查询 UIButton 的文本。

但是,在 IBAction 连接到两个不同的 UI 控件的情况下,比方说,一个按钮和一个滑块,当它是 UIButton 类型时查询发送者(而触发 UI 元素是 UISlider) 将使程序崩溃。如果您有 AnyObject,您将能够测试发送者是 UIButton 还是 UISlider,然后执行某些操作。

一般来说,如果您不关心发件人,请将其留空,这样阅读您的代码的人就会知道您没有将发件人用于任何用途。

是的,两者都有效。不同之处在于,通过将其声明为按钮,您将获得类型转换为 UIButton 的引用,而不是 AnyObject(或 Objective-C 中的 id)。如果您没有这样做,则必须在代码中手动完成。

您应该更愿意将它留给 AnyObject,以防该操作有一些您想从其他任何地方调用的代码,而不仅仅是按钮操作。

例如刷新按钮,您可能必须以编程方式进行刷新。如果您已将操作参数设置为 UIButton,则必须发送一个 UIButton(但为什么???您是以编程方式进行的,对吧?)。而如果是 AnyObject,则可以发送 'self'。这也将使您区分刷新是通过操作还是通过编程完成的。

希望能解释清楚。 对不起,没有代码。我不太喜欢 Swift 编码。欢迎编辑。

编辑

因此,即使它是 AnyObject,它也确实具有您的 UIButton 属性。只需键入 cast 即可使用它们。

如果您只打算将函数与 UIButton 一起使用,最好将发件人声明为 UIButton。这为您节省了一些代码,并且它还告诉将来阅读您的代码的任何人您只希望该函数与 UIButton 一起使用。

使用 AnyObjectAny 可以,但您需要执行 guard let button = sender as? UIButton { return } 才能将其作为按钮访问。这种方式允许您根据发件人的实际情况做出不同的反应,但我不建议这样做。