Static func vs class func 在 Swift 中:面向开发者的全面指南
\n\n每个使用 Swift 编写代码的人,迟早都会面临一个两难选择:static func 还是 class func?乍一看,这两个关键字都用于创建类型级别的方法。但它们之间的区别不仅仅是语法上的偏好,而是与继承和多态性相关的根本性差异。在本文中,我们将一劳永逸地弄清楚 Swift 中 static func 和 class func 的区别、何时使用它们,以及这些知识如何帮助您编写更清晰、更灵活的代码。
\n\nSwift 中的类型方法是什么?
\n\n在深入探讨区别之前,让我们先回顾一下基础知识。在 Swift 中,方法分为两种类型:
\n\n- \n
- 实例方法(instance methods) — 在类、结构体或枚举的特定对象上调用。 \n
- 类型方法(type methods) — 在类型本身上调用,而不是在其实例上。声明它们时使用关键字
static或class。 \n
类型方法非常适合工厂方法、单例、工具函数以及不依赖于特定对象状态的配置。
\n\nStatic func:不变性的主要守护者
\n\nstatic func 是一种不能在子类中被重写的方法。它仅属于定义它的类型。关键字 static 对于类、结构体和枚举的工作方式相同。
示例:类中的 static func
\n\nclass 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。
结构体中的 Static func
\n\n结构体(值类型)也支持静态方法:
\n\nstruct 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 是声明类型方法的唯一可能方式。
Class func:继承的灵活性
\n\nclass func 是一种可以在子类中重写的类型方法。它仅适用于类(引用类型)。结构体和枚举不能使用 class。
示例:class func 及其重写
\n\nclass 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 的行为类似于普通的虚方法,但在类型级别上调用。这为类级别的多态性开辟了可能性。