【发布时间】:2018-07-05 20:09:27
【问题描述】:
我有以下协议,它定义了一个带有属性的单例:
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: 方法来解决这个问题,但我想直接访问和修改变量。
如何编写一个协议来定义一个带有可修改变量的单例?
【问题讨论】:
-
您不能真正确保符合标准的类型只有一个单例实例,因为为此您需要在您的类中声明一个私有初始化程序,您可以这样做,但您不能在
SingletonProtocol中声明它,这样一个类就可以符合您的协议,而无需只有一个单例实例。使用您当前的实现,可以实例化任意数量的Singleton实例。 -
谢谢@DávidPásztor 的评论,有没有办法让协议在其令人欣慰的协议中“强制”私有初始化。
-
很遗憾,您不能将协议方法标记为私有。
-
你可以设置成
var shared = Singleton.shared shared.variable = 5 -
我很好奇,这里为什么需要一个协议?还有哪些其他类型符合
SingletonProtocol?