Swift私有化初始化方法
Swift私有化初始化方法

Swift私有化初始化方法

在上一篇关于《swift控制全局的单例模式》的文章中涉及单例模式,那么配合单例模式使用的就是本文的私有化初始化方法。

私有化初始化方法

private init() {}

这段代码的含义为将构造方法(初始化方法)设为私有的方法,主要有以下几个作用,特别是在实现单例模式时:

1、防止外部创建实例

通过将初始化方法设为私有 (private),你就不能从类的外部调用 init() 来创建新的实例。这意味着下面的代码将无法编译:

let instance = IAPManager() // 错误:'IAPManager' initializer is inaccessible due to 'private' protection levellet instance = IAPManager() // 错误:'IAPManager' initializer is inaccessible due to 'private' protection level

这样做的目的是确保这个类的实例只能通过类内部的 static let shared 访问,防止程序的其他部分意外创建新的对象,从而破坏单例的特性。

2、确保类只有一个实例

单例模式的核心思想是:确保一个类在应用程序的整个生命周期中只能有一个实例。当 init() 是私有的,类的外部不能创建实例时,这个类就只能通过类内部的静态属性来获取。

class IAPManager {
	static let shared = IAPManager()    // 单实例模式
	private init() {}
}

在 IAPManager 中,private init() 结合 static let shared = IAPManager(),确保了类只能通过 shared 创建和访问,这就达到了单例模式的目的。

3、防止不必要的对象创建

私有化初始化方法的另一个好处是,可以防止开发者意外地创建新的实例。通过单例的唯一实例来管理状态和资源,可以保证代码的一致性和资源利用的效率。

class IAPManager {
    static let shared = IAPManager() // 通过静态属性创建唯一实例
    private init() {} // 私有化构造方法,防止外部实例化
    func fetchSingleProduct() async throws -> Product? {
        // 业务逻辑
        return nil
    }
}
// 正确用法
let manager = IAPManager.shared
// 错误用法:这行代码会报错,因为 init() 是私有的
let anotherManager = IAPManager() // 错误:初始化方法不可访问

总结

在使用Struct或者Class时,通常情况下都是创建一个实例,创建实例的方式为:

let anotherManager = IAPManager()

当我们将构造方法进行私有化时,就无法从外部进行实例化:

private init() {} // 私有化构造方法,防止外部实例化

这是因为通常情况下,只有通过实例化创建实例,才可以使用对应的实例。当我们将构造方式使用Private进行修饰时,意味着该构造方法只能在内部使用,因此就无法创建新的实例。

同时,当我们在使用单例模式时:

static let shared = IAPManager() // 通过静态属性创建唯一实例

我们将通过该实例在全局视图下配置共享的参数,如果没有配置私有化构造方法,我们的单例模式就会被破坏,就可以从外部创建多个实例:

let instance1 = IAPManager.shared // 这是单例
let instance2 = IAPManager() // 创建了一个新的实例
let instance3 = IAPManager() // 再创建一个新的实例

// instance1, instance2, instance3 都是不同的对象

在没有私有化构造方法的情况下,外部代码可以随意调用 init() 来创建新的 IAPManager 实例。这会导致无法保证在整个应用中只有一个 IAPManager 实例。

在这种情况下,instance1、instance2、instance3 都是 IAPManager 的不同实例。这违背了单例模式的设计原则,因为单例的目的是让所有使用者都访问到同一个实例,保证状态的一致性。

因此,构造方法私有化确保了通过shared访问唯一的实例,与单例模式相互配合。私有化构造方法防止多实例的创建,保证单例模式的独特性。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注