什么时候应该使用协议替换静态功能

时间:2019-01-28 03:47:23

标签: swift static protocols

我对何时使用协议/静态功能感到困惑。

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()来显示它们。

1 个答案:

答案 0 :(得分:1)

  

一种使用协议,一种使用静态功能。哪个更好?

它们完全是不同的事物,因此请使用满足您需求的事物:

协议:协议指定一个或多个将由采用该协议的任何类实现的功能。您的class A采用protocol B,因此您可以将A的实例传递给任何需要符合B的对象的方法。可能会有类CDE也采用协议B,如果这样,您还可以将这些类中的任何一个的实例传递给同一方法。

静态函数:静态函数类似于Objective-C中的 class方法,也就是说,您可以调用该函数而无需实例化实例。它所属的类。当您在第一个示例中说出B.b()时,您正是在这样做-调用b()时,实例不为B

您提供的示例非常简单,以至于您不清楚要执行的操作,因此很难说一个比另一个更好。但是,在实际使用中,您不太可能将它们混淆。例如,考虑UITableViewDataSource:这是一个协议,它指定充当表数据源的对象必须遵循的接口。尝试使用静态函数执行此操作没有多大意义-整个问题是表并不知道应执行numberOfSections(in:)之类的函数,但是它确实需要知道要使用什么函数调用数据源对象。