首页 > 解决方案 > 使用属性定义单例的协议

问题描述

我有以下协议,它定义了一个带有属性的单例:

protocol SingletonProtocol {
    static var shared: SingletonProtocol { get }
    var variable : Int { get set }
}

以及实现此协议的以下类:

class Singleton : SingletonProtocol{
    static let shared : SingletonProtocol = Singleton()
    var variable = 4
}

如果我打电话:

Singleton.shared.variable = 5

我收到以下错误:

 change 'let' to 'var' to make it mutable

如果我在没有协议的情况下实现这个类,我不会收到错误,并且可以更改变量。我可以通过添加方法来解决这个问题,setVariable:但我想直接访问和修改变量。

如何编写一个协议来定义一个带有可以修改的变量的单例?

标签: swiftsingletonprotocols

解决方案


使协议仅可用于类(结构将无法符合此协议):

protocol SingletonProtocol: AnyObject {
    static var shared: SingletonProtocol { get }
    var variable: Int { get set }
}

现在您可以将shared属性设置为 let

class Singleton: SingletonProtocol {
    static let shared: SingletonProtocol = Singleton()
    var variable: Int = 0
}

推荐阅读