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 屬性 |
結論
我們可以在應用程式中使用靜態函式或類函式來定義實用程式任務。由於它們不依賴於例項,因此可以直接從型別本身呼叫它們。