单例中的Swift变异函数

时间:2017-06-28 16:39:27

标签: ios swift

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

这个错误很清楚。 sharedlet,显然无法修改。但要修改var我需要将方法声明为变异。这是一个恶性循环。

有什么想法吗? 感谢。

3 个答案:

答案 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")
  

设置已更改