Swift 5.1, Xcode 11 语法:
protocol FilterViewControllerDelegate: AnyObject {
func didSearch(Parameters:[String: String]?)
}
该协议仅适用于类。
回答你的第一个问题 -
但是使用时有什么区别:
与此相比的不同之处:
protocol FilterViewControllerDelegate {
func didSearch(Parameters:[String: String]?)
}
需要注意的是,该协议可以采用值类型,如枚举和结构体等。
回答你的第二个问题 -
什么时候应该使用:class协议?
当您需要使用类协议时,我想通过委托模式中的下一个示例来进行描述:
假设您有委托协议。
protocol PopupDelegate: AnyObject {
func popupValueSelected(value: String)
}
并且在另一个类中,你想要创建一个属性
var delegate: PopupDelegate?
但是这个有强引用,可能会导致内存泄漏问题。修复内存泄漏的一种方式是将委托属性设为弱引用。在我们只允许协议应用于类之前,Swift 会认为我们还可以将协议应用于值类型。
weak var delegate: PopupDelegate?
如果您尝试像使用weak一样声明委托,您将看到下一个错误:
'weak' var只能应用于类和绑定类协议类型,而不是'PopupDelegate'
但是,我们不能将weak应用于值类型。 因此,我们需要将我们的协议限制为引用类型,以便Swift知道它是引用类型。要使您可以将此委托声明为weak,您需要将该协议限制为仅由类使用:
protocol PopupDelegate: AnyObject {
func popupValueSelected(value: String)
}
FilterViewControllerDelegate
的一切是不是一个class
,以及您是否希望将类型为FilterViewControllerDelegate
的东西视为具有引用语义(例如,这将允许您使用weak
属性,我怀疑您可能需要)。请参见以下示例:swift protocol 'weak' cannot be applied to non-class type。 - Hamish