nonmutating关键字,一般配合set使用。如
protocol Settings {
subscript(key: String) -> AnyObject? { get nonmutating set }
}
为什么要用nonmutating
在声明值类型的实例为不可变变量,即let时,是不可以修改任何它内部的变量值的。
QQ20160513-2@2x.png解决方法:
一种做法是声明成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,都是可以修改的。
网友评论