Swift中的“ inout”

最近,在使用swift时,我想到了一个用例,其中我需要修改作为参数传递给函数的变量。 最终,传递给函数的所有变量都是不可变类型,无法更改,类似于let变量。 如果它是一个类对象,则不能创建新对象,但可以操纵该类对象的属性,也可以使用该对象调用任何函数。

 班级员工{ 
var名称:字符串
变量年龄:整数
  init(名称:字符串,年龄:整数){ 
self.name =名称
自我年龄=年龄
}
}
  func changeEmployeeData(emp:Employee){ 
employee.name =“ Suneet”
员工年龄= 25
}
 让员工=员工(姓名:“随机”,年龄:10) 
  print(employee.name)//随机 
print(employee.age)// 10
  changeEmployeeData(emp:员工) 
  print(employee.name)// Suneet 
print(employee.age)// 25

现在,当您的参数为原始数据类型时,就会发生问题,您根本无法更改该值。

 变量:Int = 1 
  func changeNumber(数字:整数){ 
num = 2
打印(数字)
}
  changeNumber(num:变量) 

它将显示错误“无法分配给值:’num’是’let’常量”,这是不言自明的。 我们不能修改作为参数传递的参数,因为它们是let类型的。

现在,如果要修改此值怎么办?

inout救援。
您可以在inout传递参数的地方使用它作为参考。

 变量:Int = 1 
  func changeNumber(num:inout Int){ 
num = 2
print(num)// 2
}
  changeNumber(num:&variable) 

您需要在变量的数据类型之前添加inout ,并在传递参数时添加&

回到前面的示例中,我们只是更改了属性值,如果我们想为其本身分配一个新对象,该怎么办。

 班级员工{ 
var名称:字符串
变量年龄:整数
  init(名称:字符串,年龄:整数){ 
self.name =名称
自我年龄=年龄
}
}
  func changeEmployeeData(emp:Employee){ 
emp =雇员(姓名:“ Suneet”,年龄:25)
}
  var employee = Employee(姓名:“ Random”,年龄:10) 
 打印(employee.name) 
打印(员工年龄)
  changeEmployeeData(emp:员工) 
 打印(employee.name) 
打印(员工年龄)

这将向我们显示相同的编译错误“无法分配给值:’emp’是’let’常量”。

相反,我们可以使用inout之后可以修改对象。

  func changeEmployeeData(emp:inout Employee){ 
emp =雇员(姓名:“ Suneet”,年龄:25)
}
  var employee = Employee(姓名:“ Random”,年龄:10) 
  print(employee.name)//随机 
print(employee.age)// 10
  changeEmployeeData(emp:&employee) 
  print(employee.name)// Suneet 
print(employee.age)// 25

使用inout 要记住的唯一事情是,当我们传递变量/对象的地址时,它也会修改实际的对象。