Swift - 單例類



單例類是一種特殊的類,它只有一個物件,並確保您的應用程式或程式使用該物件。如果您嘗試建立另一個單例類的變數,您將收到錯誤。單例類易於使用,但它有一個主要的缺點,即全域性訪問,這意味著您可以透過共享類的例項在全域性範圍內訪問單例類。

這使得它難以維護,可能導致併發問題等。因此,為了避免過度使用單例物件,我們使用依賴注入。依賴注入將單例物件傳遞到需要它的物件。

如果一個類依賴於單例,並且它們存在於不同的上下文中,那麼您必須將單例匯入到該上下文中,否則無法訪問該單例。

語法

以下是單例類的語法:

class Name{
   // body
}

建立和訪問單例類

我們可以像使用普通類一樣使用“class”關鍵字建立單例類,但有一些不同的規則,它們是:

  • 單例類應該有一個私有初始化器。

  • 單例類應該有一個靜態型別的物件。

私有初始化器

此私有初始化器阻止從類外部建立物件。如果您嘗試在類外部建立物件,您將收到錯誤。要建立私有初始化器,我們將使用“private”關鍵字。

語法

以下是私有初始化器的語法:

private init(){}

示例

使用私有初始化器建立單例類的 Swift 程式。

import Foundation
// Outer class
class SingletonClass{

   // Creating a private initializer
   private init(){}
    
   func show(){
      print("Hello")
   }
}

// Creating object outside the class
// We will get an error
let myObject = SingletonClass()
myObject.show()
輸出

它將產生以下輸出:

main.swift:16:16: error: 'SingletonClass' initializer is inaccessible due to 'private' protection level
let myObject = SingletonClass()

此處,私有保護級別阻止我們在類外部建立物件。因此,要克服此錯誤,我們必須在類內部建立物件。

靜態物件

如果我們在單例類中有一個靜態物件,我們可以使用類名輕鬆訪問該物件。要建立靜態物件,我們使用“Static”關鍵字。

語法

以下是靜態物件的語法:

static let objectName = className()

以下是訪問靜態物件的語法:

let variableName = className.objectName

示例

使用物件的單例類的 Swift 程式。

import Foundation
// Singleton class
class SingletonClass{

   // Creating object outside the class
   static let myObject = SingletonClass()

   // Creating a private initializer
   private init(){}
    
   // Method
   func show(){
      print("Hello I am Singleton Class")
   }
}
// Accessing the object 
let ob = SingletonClass.myObject

// Accessing the method
ob.show()
輸出

它將產生以下輸出:

Hello I am Singleton Class
單例類 普通類
在程式的整個生命週期中只有一個例項。 可以有多個例項。
不允許您建立類的例項。 允許您使用其初始化器直接建立類的例項。
您可以藉助提供對物件全域性訪問的共享屬性和方法來訪問例項。 您可以直接訪問例項。
在建立物件方面靈活性較差,並且可以在程式碼的不同部分之間使用緊耦合。 在建立物件方面靈活性更強,並且可以在程式碼的不同部分之間允許松耦合。
由於全域性狀態和依賴項,測試單例類很困難。 測試普通類要容易得多。
廣告