众所周知,类是引用类型,而结构和枚举是值类型。这意味着类对象共享该对象的单个实例,并在传递给任何函数或新对象时传递相同的引用,而值类型是建立其副本并仅传递值的类型
若是咱们尝试更改类中的任何变量,那就很简单swift
class Employee { var name : String var teamName : String init(name: String, teamName: String) { self.name = name self.teamName = teamName } func changeTeam(newTeamName : String){ self.teamName = newTeamName } } var emp1 = Employee(name : "Suneet", teamName:"Engineering") print(emp1.teamName) //Engineering emp1.changeTeam(newTeamName : "Product") print(emp1.teamName) //Product
而若是您尝试在任何值类型中执行相同操做,则会向咱们显示编译错误.函数
struct Employee { var name : String var teamName : String init(name: String, teamName: String) { self.name = name self.teamName = teamName } func changeTeam(newTeamName : String){ self.teamName = newTeamName //cannot assign to property: 'self' is immutable } }
将会显示下面code
cannot assign to property: 'self' is immutable
Struct 是值类型,咱们不可以直接修改属性。所以编译器会提示咱们作以下修改对象
mark method 'mutating' to make 'self' mutable
它明确指出,在值类型中向任何函数添加突变关键字能够使它们可以修改变量。在内部,当咱们尝试突变值类型时,它不会mutate其值,但它会mutate持有该值的变量。教程
struct Employee { var name : String var teamName : String init(name: String, teamName: String) { self.name = name self.teamName = teamName } mutating func changeTeam(newTeamName : String){ self.teamName = newTeamName } } var emp1 = Employee(name : "Suneet", teamName:"Engineering") print(emp1.teamName) //Engineering emp1.changeTeam(newTeamName : "Product") print(emp1.teamName) //Product