나의 발자취
입출력 inout 파라미터 본문
함수 내의 파라미터는 기본적으로 값타입이고(복사되어서 전달) 임시상수이기 때문에 변경이 불가하다. 이때 inout 키워드를 사용하면 참조로 전달하게 된다. 파라미터의 복사본이 전달되는 것이 아니라 원본의 주소가 전달된다. (내부적으로 copy-in copy-out 매커니즘이 실행된다.) 변수를 직접 넣었다가 뺀다고 생각하면 쉽다.
정의
하는 방법은 함수 파라미터를 할 때 파라미터 타입 앞에 inout 키워드를 추가한다.
func swapNumbers(a: inout Int, b: inout Int) {
...
}
실행 방법
swapNumbers(a: &num1, b: &num2)
위에서 inout 키워드로 선언하면 아래에서 호출할 때 자동으로 되지만, 변수를 전달할 때 & 기호를 꼭 붙어야 한다.(원본이 전달된다는 의미이다.)
주의사항
- 1) 상수(let)나, 리터럴 전달하는 것 불가능 swapNumbers(a: &a, b: &b) | swapNumbers(a: &123, b: &456) 불가
- 2) 파라미터의 기본값 선언을 허용하지 않음 func swapNumbers(a: inout Int = 5) 불가
- 3) 가변파라미터(여러개의 파라미터)로 선언하는 것 불가능 func swapNumbers(a: inout Int...) 불가
import UIKit
/*:
## inout 파라미터
* 함수를 통해, 변수를 직접 수정하고 싶은 경우는 어떻게 해야할까?
---
*/
//:>함수내의 파라미터는 기본적으로 값타입이고(복사되서 전달) 임시상수이기 때문에 변경 불가 원칙
var num1 = 123 // 전역변수
var num2 = 456 // 전역변수
func swap(a: Int, b: Int) {
// var c = a
// a = b
// b = c
}
swap(a: num1, b: num2) // 불가능하다.
/*:
---
* 함수 내에서 변수를 직접 수정하도록 돕는 inout키워드 (참조로 전달)
---
*/
//:> inout 키워드(선언시), & 사용(실행시)
num1 = 123
num2 = 456
func swapNumbers(a: inout Int, b: inout Int) {
var temp = a
a = b
b = temp
}
// 함수 실행시에는 앰퍼샌드를 꼭 붙여야함
swapNumbers(a: &num1, b: &num2)
print(num1)
print(num2)
// 입출력 파라미터는 내부적으로 copy-in, copy-out 메모리 모델를 사용하지만, 실제 원본이 전달된다고 쉽게 생각하면 됨
// *copy-in, copy-out - 값을 복사해서 함수 바디 내부로 전달하고,
// 함수가 종료될때, 아규먼트로 전달한 변수에 복사됨(함수 바디 내부에서 외부로 복사되어 전달)
/**==========================================
- inout파라미터 사용시 주의점
- 1) 상수(let)나, 리터럴 전달하는 것 불가능
- 2) 파라미터의 기본값 선언을 허용하지 않음
- 3) 가변파라미터(여러개의 파라미터)로 선언하는 것 불가능
=============================================**/
'앱 개발 > iOS' 카테고리의 다른 글
print문 (0) | 2022.05.23 |
---|---|
guard문 (0) | 2022.05.23 |
Swift :: for ... in stride / 함수 argument label, 가변 파라미터 / guard문 (0) | 2022.05.16 |
WWDC18: iOS Memory Deep Dive (0) | 2022.05.09 |
사파리 pinned tab이 메모리와 CPU를 많이 사용할까? (0) | 2021.09.30 |
Comments