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
单例类 普通类
在程序的整个生命周期中只有一个实例。 可以有多个实例。
不允许您创建类的实例。 允许您使用其初始化器直接创建类的实例。
您可以借助提供对对象全局访问的共享属性和方法来访问实例。 您可以直接访问实例。
在创建对象方面灵活性较差,并且可以在代码的不同部分之间使用紧耦合。 在创建对象方面灵活性更强,并且可以在代码的不同部分之间允许松耦合。
由于全局状态和依赖项,测试单例类很困难。 测试普通类要容易得多。
广告