我对何时使用协议/静态功能感到困惑。
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.")
}
}
一种使用协议,一种使用静态功能。哪个更好?
编辑: 有关更多详细信息,func b()将显示警报。 A是一个控制器,它将发送一个请求。如果失败,则应显示警报。请注意,有许多控制器需要显示相同的警报,因此我使用b()来显示它们。
答案 0 :(得分:1)
一种使用协议,一种使用静态功能。哪个更好?
它们完全是不同的事物,因此请使用满足您需求的事物:
协议:协议指定一个或多个将由采用该协议的任何类实现的功能。您的class A
采用protocol B
,因此您可以将A
的实例传递给任何需要符合B
的对象的方法。可能会有类C
,D
和E
也采用协议B
,如果这样,您还可以将这些类中的任何一个的实例传递给同一方法。
静态函数:静态函数类似于Objective-C中的 class方法,也就是说,您可以调用该函数而无需实例化实例。它所属的类。当您在第一个示例中说出B.b()
时,您正是在这样做-调用b()
时,实例不为B
。
您提供的示例非常简单,以至于您不清楚要执行的操作,因此很难说一个比另一个更好。但是,在实际使用中,您不太可能将它们混淆。例如,考虑UITableViewDataSource
:这是一个协议,它指定充当表数据源的对象必须遵循的接口。尝试使用静态函数执行此操作没有多大意义-整个问题是表并不知道应执行numberOfSections(in:)
之类的函数,但是它确实需要知道要使用什么函数调用数据源对象。