gpt4 book ai didi

swift - 为什么以及何时应该使用可选函数(在 Swift 中)?

转载 作者:行者123 更新时间:2023-11-30 10:02:00 27 4
gpt4 key购买 nike

我对可选功能有以下疑问:

@objc protocol SSRadioButtonControllerDelegate {
/**
This function is called when a button is selected. If 'shouldLetDeSelect' is true, and a button is deselected, this function
is called with a nil.

*/
optional func didSelectButton(aButton: UIButton?)
}
  1. 什么是可选功能?为什么不需要声明方法?它有什么用?
  2. 为什么使用 @objc 协议(protocol)而不是 @protocol

最佳答案

协议(protocol)告诉代理您已经选择了一个 UIButton。

此协议(protocol)的可选方法通知委托(delegate)者该按钮是否可选。

如果我们想在 Swift 协议(protocol)中使用可选方法,我们可以使用 @objc 属性。

@objc protocol SSRadioButtonControllerDelegate: class {
optional func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
func didSelectButton(sender: UIButton?)
}

这也意味着 Swift 结构体或枚举不能再采用此协议(protocol)。但这并不重要,因为您已经将其设为类协议(protocol)。

@objc 属性似乎不是 Swift-y。那么,当我们认为 Swift 协议(protocol)中需要一个可选方法时,我们的替代方案是什么?

将可选方法移至单独的协议(protocol):

protocol SSRadioButtonControllerDelegate: class {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
}

然后,您可以选择在主视图 Controller 中采用并实现这个新的委托(delegate)方法。

controller.delegate = self
// Uncomment if we need to implement shouldLetDeSelect:
// controller.ButtonSelectionDelegate = self

另一种方法是为扩展中的“可选”方法提供默认实现。我们可以通过删除 @objc 和可选属性来清理协议(protocol)定义:

protocol SSRadioButtonControllerDelegate: class {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
func didSelectButton(sender: UIButton?)
}

该方法现在是强制性的,并且必须在某处实现。

extension SSRadioButtonControllerDelegate {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool {
return true
}
}

关于swift - 为什么以及何时应该使用可选函数(在 Swift 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37957523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com