【发布时间】:2016-11-20 05:43:11
【问题描述】:
考虑一下 Swift 中的这个类:
class Zombie: Monster {
var walksWithLimp = true
final override func terrorizeTown()
{
town?.changePopulation(-10)
super.terrorizeTown()
}
func changeName(name: String, walksWithLimp: Bool)
{
self.name = name
self.walksWithLimp = walksWithLimp
}
}
Zombie 继承了 Monster 类的 name 字段。
var name = "Monster"
为什么
fredTheZombie.changeName("Tom", walksWithLimp: true)
即使函数头之前没有 mutating 关键字也能工作?
【问题讨论】:
-
A
class是 Swift 中的引用类型。因此,改变 类实例fredTheZombie将意味着改变它的实际引用。另一方面,改变它的包装成员不被视为改变类实例本身。因此在这种情况下不需要mutating关键字。 -
我已经读过,为了更改类中变量的值(在实例方法内),您必须声明函数变异。我还没有这样做...
-
这是一个适用于改变值类型成员的规则(例如
struct的成员属性)。改变值类型的成员意味着改变值类型本身(self),而改变引用类型的成员并不意味着改变引用类型的引用(被认为是self)。 -
乐于助人。有关更多详细信息,请参阅The Language Guide - Methods 中的从实例方法中修改值类型小节。