Static func vs class func 在 Swift 中的区别是什么?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Static func vs class func 在 Swift 中:面向开发者的全面指南

\n\n

每个使用 Swift 编写代码的人,迟早都会面临一个两难选择:static func 还是 class func?乍一看,这两个关键字都用于创建类型级别的方法。但它们之间的区别不仅仅是语法上的偏好,而是与继承和多态性相关的根本性差异。在本文中,我们将一劳永逸地弄清楚 Swift 中 static func 和 class func 的区别、何时使用它们,以及这些知识如何帮助您编写更清晰、更灵活的代码。

\n\n

Swift 中的类型方法是什么?

\n\n

在深入探讨区别之前,让我们先回顾一下基础知识。在 Swift 中,方法分为两种类型:

\n\n
    \n
  • 实例方法(instance methods) — 在类、结构体或枚举的特定对象上调用。
  • \n
  • 类型方法(type methods) — 在类型本身上调用,而不是在其实例上。声明它们时使用关键字 static 或 class。
  • \n
\n\n

类型方法非常适合工厂方法、单例、工具函数以及不依赖于特定对象状态的配置。

\n\n

Static func:不变性的主要守护者

\n\n

static func 是一种不能在子类中被重写的方法。它仅属于定义它的类型。关键字 static 对于类、结构体和枚举的工作方式相同。

\n\n

示例:类中的 static func

\n\n
class Animal {\n    static func describe() {\n        print("我是动物。我的本质无法改变。")\n    }\n    \n    func speak() {\n        print("发出声音")\n    }\n}\n\nclass Dog: Animal {\n    // 错误!不能重写 static 方法\n    // override static func describe() { }\n    \n    override func speak() {\n        print("汪汪!")\n    }\n}\n\n// 使用\nAnimal.describe()  // "我是动物。我的本质无法改变。"\nDog.describe()     // 也是 "我是动物。我的本质无法改变。"\n
\n\n

请注意:Dog.describe() 调用了父类的方法。虽然从技术上讲,子类继承了静态方法,但不能重写它。这种行为类似于 final class func。

\n\n

结构体中的 Static func

\n\n

结构体(值类型)也支持静态方法:

\n\n
struct MathHelper {\n    static func square(_ number: Int) -> Int {\n        return number * number\n    }\n}\n\nlet result = MathHelper.square(5)  // 25\n
\n\n

由于结构体不支持继承,因此 static 是声明类型方法的唯一可能方式。

\n\n

Class func:继承的灵活性

\n\n

class func 是一种可以在子类中重写的类型方法。它仅适用于类(引用类型)。结构体和枚举不能使用 class。

\n\n

示例:class func 及其重写

\n\n
class Vehicle {\n    class func makeNoise() {\n        print("交通工具发出噪音")\n    }\n    \n    class final func isMotorized() -> Bool {\n        return true\n    }\n}\n\nclass Car: Vehicle {\n    override class func makeNoise() {\n        print("汽车轰鸣:嗡嗡嗡!")\n    }\n    \n    // 错误!不能重写 final class func\n    // override class func isMotorized() -> Bool { return false }\n}\n\n// 使用\nVehicle.makeNoise()  // "交通工具发出噪音"\nCar.makeNoise()      // "汽车轰鸣:嗡嗡嗡!"\n
\n\n

如您所见,class func 的行为类似于普通的虚方法,但在类型级别上调用。这为类级别的多态性开辟了可能性。

\n\n

博客

书籍推荐