Swift에서 함수의 매개변수는 Constant이므로 기본적으로 변경이 불가능하다. 하지만 함수 내에서 매개변수의 값을 변경하고싶은 경우 매개변수의 Data Type 앞에 inout 키워드를 붙여주면 가능하다.
inout 매개변수는 아래와같이 동작한다.
- 함수가 호출되면 매개변수로 들어온 값이 복사된다.
- 함수 안에서 값이 변경된다.
- 함수가 반환될 때, 기존 변수 값에 변경된 값이 할당된다.
이 과정이 실행되는 원리는 호출되는 함수 밖과 함수 안에서 해당 매개변수의 주소값을 참조하는 구조이다. 때문에 inout 매개변수를 사용하는 함수에 인자를 넣을 때는 c에서와 유사하게 ampersand(&) 연산자를 붙여 표기한다.
공식문서에서 inout 매개변수는 함수가 함수의 범위를 벗어날 수 있도록 하는 방법이라고 소개하고있는데_(an alternative way for a function to have an effect outside of the scope of its function body.), 잘못하면 Swift의 메모리 안정성을 위배할 수 있다.
var global = "Global Variable"
func function(_ param: inout String) {
param += global
}
function(&global)
// error: Execution was interrupted, reason: signal SIGABRT.
위의 예시와 같이 전역변수를 inout 매개변수로 전달한 후 함수 내에서 전역변수를 동시에 사용하는 경우, read와 write가 동시에 수행되며 런타임에러가 발생한다.
따라서 함수 내에서 inout 매개변수로 전달된 변수에 접근해서는 안된다.