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
要记住的唯一事情是,当我们传递变量/对象的地址时,它也会修改实际的对象。