在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中如何實作呢?
Swift中我們可以在參數類型的前面加上一個 inout 關鍵字,并在調用函數時在參數前加個取位址符 &,如下所示:
func doSomething(numArr: inout [String]){
numArr.append("4")
}
var numbers = ["1","2","3"]
doSomething(numArr: &numbers)
print(numbers)
控制台列印結果為:
注意,inout 修飾參數時采用的是拷入拷出模式,即在函數内部使用的是參數的copy,函數結束後,又對參數重新指派。
由此,可以延伸一下,當一個類的屬性被設定了 willSet 和 didSet 觀察器時,如果該屬性被作為函數參數,同時被 inout 修飾,那麼當調用此函數時,會觸發 willSet 和 didSet 觀察器。