我什么时候应该使用协议来替换静态函数

when should I use protocol to replace static function

我对何时使用 protocol/static 功能感到困惑。

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是一个Controller,它会发送一个请求。如果失败,则应显示警报。请注意,有许多控制器需要显示相同的警报,所以我使用 b() 来显示它们。

One use protocol and one use static function. Which one is better?

它们完全不同,所以请使用能满足您需要的东西:

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

静态函数:静态函数类似于class方法中的Objective-C,即也就是说,您可以在不需要它所属的 class 实例的情况下调用该函数。当您在第一个示例中说 B.b() 时,您所做的正是 - 调用 b() 而没有 B 实例

你举的例子太简单了,不清楚你想做什么,所以很难说一个比另一个好。但是,在实际使用中,您不太可能将它们混淆。例如,考虑 UITableViewDataSource:它是一个协议,指定充当 table 的数据源的对象必须遵守的接口。尝试用静态函数来做这件事没有多大意义——关键是 table 不知道像 numberOfSections(in:) 这样的函数的实现应该是什么,但它确实需要知道在数据源对象中调用什么函数。