在Swift
我有这个单身人士
struct Networking {
static let shared = Networking()
private var observed: Set<String> = []
}
我必须操纵observed
,我需要创建有用的方法来插入和删除Set
中的成员。
mutating func addObserver(for member: String) {
//other code
observed.insert(member)
}
mutating func removeObserver(for member: String) {
//other code
observed.remove(member)
}
问题是当我尝试像这样调用这个方法时
Networking.shared.addObserver(for: "x")
因为我收到此错误
cannot use mutating on immutable value: “shared” is a “let” constant
这个错误很清楚。 shared
为let
,显然无法修改。但要修改var
我需要将方法声明为变异。这是一个恶性循环。
有什么想法吗? 感谢。
答案 0 :(得分:1)
如果您希望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")
对象充当单例,为什么不将它变成类而不是结构?
{{1}}
这简化了代码并解决了您的问题。
答案 1 :(得分:1)
基本上您的语法错误,Networking()
会创建一个新的实例。
要将结构用作单例,您必须编写
Networking.shared.addObserver(for: "x")
然后将shared
声明为可变
static var shared = Networking()
答案 2 :(得分:0)
还有另一种方法
class Networking {
static let shared = Networking()
var observed: Set<String> = [] {
didSet {
print("set has changed")
}
}
}
由于Set
是结构(值类型),因此每次添加或删除didSet
块时都会执行Set
块。
Networking.shared.observed.insert("a")
设置已更改
Networking.shared.observed.insert("b")
设置已更改
Networking.shared.observed.remove("a")
设置已更改