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+ 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告