Swift 中静态函数和类函数有什么区别?

swiftserver side programmingprogramming更新于 2025/10/10 3:22:17

本文将介绍静态函数和类函数之间的区别。

很多时候,你可能认为它们是同一个东西,但事实并非如此。让我们来了解一下它们之间的区别。

什么是静态函数?

在 Swift 中,静态函数是一种与类型关联而非与实例关联的函数。这意味着实例不需要调用静态函数,因为它可以从类型本身调用。

示例

以下是 Swift 中定义静态函数的示例 -

struct ViewPoint {
   static func defaultOrigin() -> ViewPoint {
      return ViewPoint(x: 0, y: 0)
   }
   var x: Int
   var y: Int
}
let origin = ViewPoint.defaultOrigin()
print(origin)

输出

ViewPoint(x: 0, y: 0)

解释

在上面的例子中,我们创建了一个名为 ViewPoint 的结构体,它包含一些属性,例如 x 和 y。在 ViewPoint 结构体中,我们定义了一个名为 defaultOrigin() 的静态函数来获取默认的原点值。

您可以看到,我们使用类型本身调用了 defaultOrigin() 函数,而没有创建该类型的实例。

什么是类函数?

在 Swift 中,类函数是一种与类关联而非与实例关联的函数类型。这意味着您可以在类本身上调用类函数,而不是在类的实例上调用。

示例

以下是在 Swift 中定义类函数的示例 -

class ViewPoint {

   class func defaultOrigin() -> ViewPoint {
      return ViewPoint(x: 0, y: 0)
   }

   var x: Int
   var y: Int

   init(x: Int, y: Int) {
      self.x = x
      self.y = y
   }
}
let origin = ViewPoint.defaultOrigin()
print("x: \(origin.x), y: \(origin.y)")

输出

x: 0, y: 0

解释

在上面的例子中,我们创建了一个名为 ViewPoint 的类,它包含一些属性,例如 x 和 y。在 ViewPoint 类中,我们定义了一个名为 defaultOrigin() 的类函数来获取默认原点值。

您可以看到,我们使用类型本身调用了 defaultOrigin() 函数,而没有创建该类型的实例。

为什么我们需要静态函数或类函数?

每当我们在应用程序中编写代码时,我们可能需要包含一些执行实用任务的实用函数。您可以将这些方法定义为静态函数或类函数,以便在不创建该类型的实例的情况下调用它们。

它们之间有什么区别?

  • 静态函数可以与结构体、类或枚举等类型关联,而类函数只能与类类型关联。

  • 静态函数使用 static 关键字定义,而类函数使用 class 关键字定义。

  • 类函数可以被子类覆盖,而静态函数不能被覆盖。

  • 类函数可以访问类的自身属性,而静态函数则不能。

示例

以下是如何在 Swift 中覆盖类函数的示例 -

class ViewPoint {
   class func defaultOrigin() -> ViewPoint {
      return ViewPoint(x: 0, y: 0)
   }
   var x: Int
   var y: Int
   init(x: Int, y: Int) {
      self.x = x
      self.y = y
   }
}
class RectangleView: ViewPoint {
   override class func defaultOrigin() -> ViewPoint {
      return ViewPoint(x: 1, y: 1)
   }
}
let originView = ViewPoint.defaultOrigin()
print("View Origin -> x: \(originView.x), y: \(originView.y)")
let originRectangle = RectangleView.defaultOrigin()
print("Rectangle Origin -> x: \(originRectangle.x), y: \(originRectangle.y)")

输出

View Origin -> x: 0, y: 0
Rectangle Origin -> x: 1, y: 1

说明

在此示例中,

步骤 1 − ViewPoint 类有一个名为 defaultOrigin() 的类函数和一个名为 staticOrigin() 的静态函数,该函数返回 x 和 y 值为 0 的 ViewPoint 实例。

步骤 2 − RectangleView 类是 ViewPoint 的子类,它重写了 defaultOrigin() 类函数,返回 x 和 y 值为 1 的 ViewPoint 实例。

您可以看到,子类 RectangleView 中重写的 staticOrigin() 函数已被注释禁用。您可以删除注释并运行此代码,然后会看到类似"error: cannot override static method"的错误。

静态函数和类函数的区别

静态函数

类函数

可以与类、结构体或枚举关联。

只能与类关联。

由 static 关键字定义。

由 class 关键字定义。

无法在子类中被重写。

可以在子类中被重写。

无法访问自身属性

可以访问自身属性

结论

我们可以在应用程序中使用静态函数或类函数来定义实用任务。由于它们不依赖于实例,因此可以直接从类型本身调用它们。



相关文章



关于我们 | 隐私条款 | 学习路线
返回顶部