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


您将在这篇文章中了解静态函数和类函数之间的区别。

很多时候,您可能会认为它们是同一件事,但事实并非如此。让我们了解它们之间的区别。

什么是静态函数?

在 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 关键字定义。

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

  • 类函数可以访问类的 self 属性,而静态函数则无法访问。

示例

以下是如何在 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 关键字定义。

不能在子类中被覆盖。

可以在子类中被覆盖。

无法访问 self 属性

可以访问 self 属性

结论

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

更新于: 2023 年 1 月 3 日

10K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.