swift - 我什么时候应该使用协议(protocol)来替换静态函数

标签 swift static protocols

我对何时使用协议(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 的对象的方法。可能有类 CDE 也采用协议(protocol) B,如果是这样,您也可以将任何这些类的实例传递给相同的方法。

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

您提供的示例非常简单,不清楚您要做什么,因此很难说一个比另一个更好。但是,在实际使用中,您不太可能将它们混淆。考虑 UITableViewDataSource,例如:它是一个协议(protocol),指定充当表数据源的对象必须遵守的接口(interface)。尝试用静态函数来做这件事没有多大意义——重点是表不知道像 numberOfSections(in:) 这样的函数的实现应该是什么,但它确实需要知道在数据源对象中调用什么函数。

关于swift - 我什么时候应该使用协议(protocol)来替换静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54395299/

相关文章:

ios - 使用 Swift for iOS 以编程方式创建和存储 PDF 文档

以类名作为返回类型的java实例变量

swift - 我如何转换为像 : MyType<ConformingX> (ConformingX is a class that conforms to a protocol) 这样的通用类型

swift - 如何避免 Mojave 上的 Safari 扩展崩溃?

与 .some/.none 匹配的 Swift 切换模式

swift - 当 api 位于 {} 而不是 [] 中时,如何从 api 中获取内容

java - Android中静态变量的生命周期

android - Kotlin 静态函数 : companion object, @JvmStatic @JvmField

swift - 如何实例化由扩展完全定义的协议(protocol)的默认实现

swift - 我可以使用内部泛型进行快速扩展吗?