Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 单态中的快速变异函数_Ios_Swift - Fatal编程技术网

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