在Swift中不允许修改方法函数中的参数值,因为方法中参数传递的是值而不是地址,参数被修改时编译器会认为此参数为常量类型,并且提示'Cannot assign to value: 'xxx' is a 'let' constant'
的错误。
看下面代码:
func verifyInout() -> Void {
let datas: [Any] = [1,2,3,4,5,6]
print("datas",datas)
handleData(datas: datas)
print("\(#function)", datas)
}
func handleData(datas:[Any]) -> Void {
datas = [7,8,9,0]
print("\(#function)",datas)
}
此时会报错误
那如何实现方法/函数参数可以被修改呢?
解决方法:使用inout
将方法/函数参数定义为输入输出形式参数;
在形式参数定义开始的时候在前边添加一个 inout关键字可以定义一个输入输出形式参数。输入输出形式参数有一个能输入给函数的值,函数能对其进行修改,还能输出到函数外边替换原来的值.
将上面的代码进行修改就可以了
func verifyInout() -> Void {
var datas: [Any] = [1,2,3,4,5,6]
print("datas",datas)
handleData(datas: &datas)
print("\(#function)", datas)
}
func handleData(datas: inout [Any]) -> Void {
datas = [7,8,9,0]
datas.insert(contentsOf: [11,12], at: 2)
print("\(#function)",datas)
}
调用时使用&取地址,想方法中传入地址
handleData(datas: &datas)
注意:只能把变量作为输入输出形式参数的实际参数。你不能用常量或者字面量作为实际参数,因为常量和字面量不能修
查看对象内存结构
fr v -R datas 和 fr v -R &datas
网友评论