定义具有属性的单例的协议

时间:2018-06-13 09:04:19

标签: swift singleton protocols

我有以下协议定义具有属性的单例:

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:方法来解决这个问题,但我想直接访问和修改变量。

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

3 个答案:

答案 0 :(得分:3)

使协议仅适用于类(struct将无法符合此协议):

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
}

答案 1 :(得分:0)

更改

static let shared : SingletonProtocol = Singleton()

static var shared : SingletonProtocol = Singleton()
private init() {} 

答案 2 :(得分:-2)

在你的单例类中,将变量声明从let更改为var。所以这与议定书的声明相同。

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

编辑:

还在协议声明中仅为sharedInstance添加getter,以便将单例类用作:

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