Swift中的“变异”

众所周知,类是引用类型,而结构和枚举是快速的值类型。 这意味着类对象共享该对象的单个实例,并在传递给任何函数或新对象时传递相同的引用,而值类型是创建其副本并仅传递值的类型。

如果我们尝试更改类中的任何变量,那就很简单。

 班级员工{ 
var名称:字符串
var teamName:字符串
  init(name:String,teamName:String){ 
self.name =名称
self.teamName = teamName
}
  func changeTeam(newTeamName:String){ 
self.teamName = newTeamName
}
}
  var emp1 = Employee(name:“ Suneet”,teamName:“ Engineering”) 
  print(emp1.teamName)//工程 
emp1.changeTeam(newTeamName:“产品”)
print(emp1.teamName)//产品

而如果您尝试在任何值类型中执行相同操作,则会向我们显示编译错误,

  struct Employee { 
var名称:字符串
var teamName:字符串
  init(name:String,teamName:String){ 
self.name =名称
self.teamName = teamName
}
  func changeTeam(newTeamName:String){ 
self.teamName = newTeamName
//无法分配给属性:“ self”是不可变的
  } 
}

它会向我们显示以下错误

 无法分配给属性:“自我”是不可变的 

由于结构是值类型,因此我们无法直接修改属性。

编译器还为我们提供了可能的解决方案

 注意:将方法标记为“变异”以使“自身”可变 

它明确指出,将mutating关键字添加到值类型的任何函数中可以使他们能够修改变量。 在内部,当我们尝试更改值类型时,它不会更改其值,但会更改保存该值的变量。

  struct Employee { 
var名称:字符串
var teamName:字符串
  init(name:String,teamName:String){ 
self.name =名称
self.teamName = teamName
}
  变异 func changeTeam(newTeamName:String){ 
self.teamName = newTeamName
}

}
  var emp1 = Employee(name:“ Suneet”,teamName:“ Engineering”) 
  print(emp1.teamName)//工程 
emp1.changeTeam(newTeamName:“产品”)
print(emp1.teamName)//产品

不仅enumstruct ,还有其他数据类型也属于值类型。

  • 枚举
  • 结构
  • 整数
  • 数组
  • 字典
  • 元组

而以下参考类型

  • 功能
  • 关闭