Các tham số hàm theo mặc định là hằng số. Việc cố gắng thay đổi giá trị của một tham số hàm từ bên trong phần thân của hàm đó dẫn đến lỗi thời gian biên dịch.
inout có nghĩa là việc sửa đổi biến cục bộ cũng sẽ sửa đổi các tham số được truyền vào. Nếu không có nó, các tham số được truyền vào sẽ vẫn giữ nguyên giá trị. Cố gắng nghĩ về kiểu tham chiếu khi bạn đang sử dụng inout và kiểu giá trị để không sử dụng nó.
struct MyStruct {
private var myInt: Int = 1
// ... lots and lots of stored properties
mutating func increaseMyInt() {
myInt += 1
}
}
/* call to function _copies_ argument to function property 'myHugeStruct' (copy 1)
function property is mutated
function returns a copy of mutated property to caller (copy 2) */
func myFunc(var myHugeStruct: MyStruct) -> MyStruct {
myHugeStruct.increaseMyInt()
return myHugeStruct
}
/* call-by-reference, no value copy overhead due to inout opimization */
func myFuncWithLessCopyOverhead(inout myHugeStruct: MyStruct) {
myHugeStruct.increaseMyInt()
}
var a = MyStruct()
a = myFunc(a) // copy, copy: overhead
myFuncWithLessCopyOverhead(&a) // call by reference: no memory reallocation