天天看点

Swift 数组Array作为函数参数时如何在函数内部改变其值?

在Objective-C中我们经常会将可变数组(NSMutableArray)作为函数参数,然后在函数内部对其值进行更改:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *numbers = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
    [self doSomething:numbers];
    NSLog(@"%@",numbers);
}

- (void)doSomething:(NSMutableArray *)numArr{
    [numArr addObject:@"4"];
}
           

控制台打印numbers,结果如下:

Swift 数组Array作为函数参数时如何在函数内部改变其值?

那么同样的需求在Swift中如何实现呢?

Swift中我们可以在参数类型的前面加上一个 inout 关键字,并在调用函数时在参数前加个取地址符 &,如下所示:

        func doSomething(numArr: inout [String]){
            numArr.append("4")
        }
        var numbers = ["1","2","3"]
        doSomething(numArr: &numbers)
        print(numbers)
           

控制台打印结果为:

Swift 数组Array作为函数参数时如何在函数内部改变其值?

注意,inout 修饰参数时采用的是拷入拷出模式,即在函数内部使用的是参数的copy,函数结束后,又对参数重新赋值。

由此,可以延伸一下,当一个类的属性被设置了 willSet 和 didSet 观察器时,如果该属性被作为函数参数,同时被 inout 修饰,那么当调用此函数时,会触发 willSet 和 didSet 观察器。