我对何时使用协议(protocol)/静态函数感到困惑。
class A {
func a() {
B.b()
}
}
class B {
static func b() {
print("do sth.")
}
}
class A: B {
func a() {
self.b()
}
}
protocol B {
func b()
}
extension B {
func b() {
print("do sth.")
}
}
一种使用协议(protocol),一种使用静态函数。哪个更好?
编辑: 有关更多详细信息, func b() 将显示警报。 A是一个Controller,它会发送一个请求。如果失败,则应显示警报。请注意,有许多 Controller 需要显示相同的警报,因此我使用 b() 来显示它们。
最佳答案
One use protocol and one use static function. Which one is better?
它们完全不同,所以请使用能满足您需要的东西:
协议(protocol):协议(protocol)指定一个或多个功能,这些功能将由采用该协议(protocol)的任何类实现。您的 class A
采用 protocol B
,因此您可以将 A
的实例传递给任何需要符合 B 的对象的方法
。可能有类 C
、D
和 E
也采用协议(protocol) B
,如果是这样,您也可以将任何这些类的实例传递给相同的方法。
静态函数:静态函数类似于 Objective-C 中的类方法,也就是说您可以调用该函数而不需要类的实例它所属的类。当您在第一个示例中说 B.b()
时,您就是在这样做——调用 b()
而没有 instance B
.
您提供的示例非常简单,不清楚您要做什么,因此很难说一个比另一个更好。但是,在实际使用中,您不太可能将它们混淆。考虑 UITableViewDataSource
,例如:它是一个协议(protocol),指定充当表数据源的对象必须遵守的接口(interface)。尝试用静态函数来做这件事没有多大意义——重点是表不知道像 numberOfSections(in:)
这样的函数的实现应该是什么,但它确实需要知道在数据源对象中调用什么函数。
关于swift - 我什么时候应该使用协议(protocol)来替换静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54395299/