Swift nonmutating

nonmutating关键字,一般配合set使用。如

protocol Settings {
    subscript(key: String) -> AnyObject? { get nonmutating set }
}

为什么要用nonmutating

在声明值类型的实例为不可变变量,即let时,是不可以修改任何它内部的变量值的。

解决方法:
一种做法是声明成var,想怎么改,就怎么改。

另一种做法就是nonmutating,它告诉编译器不会修改实例内部的值,也就是set时,不会改变任何其他的变量。

struct Test2 {
    
    var b: Int {
        get {
            return  2
        }
        nonmutating set {
            print("\(newValue)")
        }
    }
}

let t = Test2()
t.b = 3
print(t.b)

为什么要强调值类型

引用类型指class。因为在引用类型中,没有这种限制。无论你将实例声明为var或者let,都是可以修改的。

参考:The why of nonmutating

你可能感兴趣的:(Swift nonmutating)