Ios 单态中的快速变异函数
在Ios 单态中的快速变异函数,ios,swift,Ios,Swift,在Swift中,我有一个单身汉 struct Networking { static let shared = Networking() private var observed: Set<String> = [] } 问题是当我尝试像这样调用这个方法时 Networking.shared.addObserver(for: "x") 因为我犯了这个错误 cannot use mutating on immutable value: “shared” is a “l
Swift
中,我有一个单身汉
struct Networking {
static let shared = Networking()
private var observed: Set<String> = []
}
问题是当我尝试像这样调用这个方法时
Networking.shared.addObserver(for: "x")
因为我犯了这个错误
cannot use mutating on immutable value: “shared” is a “let” constant
这个错误很明显shared
是let
,显然不能修改。但是要修改var
,我需要将方法声明为mutating。这是一个恶性循环
有什么想法吗?
谢谢。如果你想让你的
网络
对象充当一个单例,为什么不把它变成一个类而不是一个结构呢
class Networking {
static let shared = Networking()
private var observed: Set<String> = []
func addObserver(for member: String) {
//other code
observed.insert(member)
}
func removeObserver(for member: String) {
//other code
observed.remove(member)
}
}
Networking.shared.addObserver(for: "x")
班级网络{
静态let shared=Networking()
观察到的私有变量:Set=[]
func addObserver(用于成员:字符串){
//其他代码
插入(成员)
}
func removeObserver(用于成员:字符串){
//其他代码
删除(成员)
}
}
Networking.shared.addObserver(用于“x”)
这简化了代码并解决了您的问题。基本上,您的语法是错误的,
Networking()
创建了类的一个新的实例
要将结构作为单例使用,必须编写
Networking.shared.addObserver(for: "x")
然后将shared
声明为可变
static var shared = Networking()
还有另一种方法
class Networking {
static let shared = Networking()
var observed: Set<String> = [] {
didSet {
print("set has changed")
}
}
}
布景变了
布景变了
布景变了
如果将网络作为单例使用,为什么不将其作为一个类呢?可变值类型不能是单例-根据定义,单例本身只能有一个实例。对于可变值类型,只要您对它的副本进行变异,就会得到不同的“实例”。如果您想使用结构作为singleton的首选项,但该结构不能与singleton设计一起使用。@PEEJWEEJ您可以将不可变值类型作为singleton–这将满足所需的语义。很抱歉,我插入了一个拼写错误。我已删除
网络()
。但正确的声明是作为var共享的吗?这违反了单例模式,实际上使用类的另一种解决方案更可取。
class Networking {
static let shared = Networking()
var observed: Set<String> = [] {
didSet {
print("set has changed")
}
}
}
Networking.shared.observed.insert("a")
Networking.shared.observed.insert("b")
Networking.shared.observed.remove("a")