Swift 에서 함수의 매개변수는
상수 [ Constant ] 이므로,
함수 내부에서 매개변수의 값을 변경할 수 없다.
// example1
func exampleFunction (_ name: String) {
name = "Eugenie" // Error
}
위와 같이 매개변수 name
을
함수 내에서 값을 바꾸면
'name' is a 'let' constant
라는
에러 메세지가 나온다.
만약 함수에서 매개변수 값을 변경하고,
변경된 값이 함수 호출 후에도 지속되길 원한다면
inout
매개변수를 사용하면 된다.
inout 매개변수는
매개변수의 타입 앞에 inout
키워드를 추가하면 된다.
변수만을 취급하며, 함수의 인자로 전달할 때 &
를 사용하여,
해당 값이 함수 내부에서 변경될 것임을 나타내야 한다.
// example2
func swapNum(_ a: inout Int, _ b: inout Int) {
let temp = 0
a = b
b = temp
}
var param_a = 1
var param_b = 100
swapNum(¶m_a, ¶m_b)
print("a: \(param_a), b: \(param_b)")
inout 원리
inout 의 과정은 다음과 같다.
위의 과정을 'copy-in copy-out' 혹은
'call by value result' 라고 부른다.
// example3
var num = 1
func countNum(_ number: inout Int) {
number += num
}
countNum(&num)
// Error
변수 num
과 number
는
같은 메모리 주소를 참조하고 있다.
일기, 쓰기가 동시에 이루어져 충돌이 발생할 수 있다.
📚 Reference
The Swift Programming language guide - Function
Swift - Inout 파라미터