본문 바로가기

Swift

Swift - In Out Parameters (입출력 파라미터)

Swift 입출력 파라미터. (In-out parameters)

 

새로운 변수 2개 선언

var num1 = 12 

var num2 = 34 

 

func swapNumber(_ a: Int, with b: Int) { 

    var tmp = a 

    a = b // error

    b = tmp // error

  }

a 와 b는 임시상수임. 즉, 함수 바디에서 값을 변경 할 수 없음. 

 

swapNumber(num1, with: num2) 

 

함수 본문에는 값형식이 복사됨. INT가 값타입이기 때문.  

함수 바디에서 바꿔도 두 변수에 값은 바뀌지 않음. 파라미터가 상수이기 때문에 바꾸는 것도 불가능. 

바꾸눈게 가능해도 복사본이기 때문에 INT로 전달한 값(원본)을 바꾸는게 불가능. 

 

inout parameter를 사용하면 아규먼트로 전달한 값(원본)을 직접 바꿀 수 있음.

문법:

 

(name: inout Type)

functionName(argLabel: &expr)



function swapNumber(_ a: inout Int, with b: inout Int) {

let tmp = a 

a = b

b = tmp

 

swapNumber(&num1, with: &num2)

 

Copy in copy out 메모리모드 사용.

Copy in: num1값이 복사되어 a 로 전달바디에서는 a를 임시상수로 전달. 함수 종료 후 변경 된 a 값이 

함수 종료시 함수에 변경된 값이 아규먼트로 복사되어 전달. 

Copy out: 함수에서 변경한 값이 argument에 복사되어 전달 (copyout) 함수내부바디에서 외부로 복사됨. 

변경한 a에 값이 num1에 전달. 변경된 b는 num2에 전달

 

아규먼트에 동일한 변수를 두 번 이상 전달하는 것은 불가능. 그럼 값을 바꾸는 의미가 없음. 리터럴을 전달하는 것과 상수를 전달하는 것도 안됨. 

리터럴은 값을 바꿀 수 없고 값을 바꿀수 있는 메모리공간도 가지고 있지 않음. 상수는 값을 바꿀 후 없음. 가변파라미터와 기본값도 안됨.

 

메모리 공간이 있는 변수를 전달해야 copy-out이 가능함. 

 

'Swift' 카테고리의 다른 글

Swift - guard 문  (0) 2020.03.30
Swift - Comparison Operator (비교연산자)  (0) 2020.03.23
Swift - Generics(제네릭)  (0) 2020.03.22
Swift - Self & Super  (0) 2020.03.22
Swift - 고차 함수  (0) 2020.03.21