Generics 함수를 공부하던 중, inout이 어떻게 작동하는지 궁금해져서 한번 주솟값들을 찍어봤습니다.
swift에서 inout은 C언어의 Call by Reference와 똑같이 작동할까요?
먼저 C언어에서 Call by Reference를 살펴볼게요
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
int a = 42;
int b = 21;
swap(&a, &b);
}
C에서는 pointer를 사용하여, 주솟값을 함수로 넘겨줍니다.
그리고 이 주솟값 안의 변수를 복사하고 수정하는 등의 작업을 손쉽게 처리할 수 있습니다.
이렇게 실제로 주솟값을 보내서 해당 주솟값이 가리키는 변수만 수정한다는 것을 알 수 있었습니다.
Before Call Swap Function
a: 42(address: 0x16f7c362c)
b: 21(address: 0x16f7c3628)
----------------------------
In Function
Before Swap
a: 42(address: 0x16f7c362c)
b: 21(address: 0x16f7c3628)
After Swap
a: 21(address: 0x16f7c362c)
b: 42(address: 0x16f7c3628)
----------------------------
After Call Function
a: 21(address: 0x16f7c362c)
b: 42(address: 0x16f7c3628)
그럼 Swift의 inout 키워드에서는 어떨까요?
import Foundation
func address(of object: UnsafeRawPointer) -> String{
let address = Int(bitPattern: object)
return String(format: "%p", address)
}
func swapTwoValues<T>(a: inout T, b: inout T) {
var temp = a
print("In Function")
print("------------")
print("a:", address(of: &a))
print("b:", address(of: &b))
a = b
b = temp
print("a:", address(of: &a))
print("b:", address(of: &b))
print("------------")
}
var a = "abc"
var b = "cde"
print("Before call function")
print("------------")
print("a: ", address(of: &a))
print("b: ", address(of: &b))
print("------------")
swapTwoValues(a: &a, b: &b)
print("After call function")
print("------------")
print("a: ", address(of: &a))
print("b: ", address(of: &b))
print("------------")
마찬가지로 해당 변수의 주솟값은 그대로 있고 주솟값이 가리키는 변수를 수정하는 작업과 정확히 같은 작업이 일어납니다.
Before call function
------------
a: 0x100008008
b: 0x100008018
------------
In Function
------------
a: 0x100008008
b: 0x100008018
a: 0x100008008
b: 0x100008018
------------
After call function
------------
a: 0x100008008
b: 0x100008018
------------
copy-in copy-out 되는 과정은, 주솟값이 복사되는 걸로 (일단)
'iOS 개발 > SwiftUI' 카테고리의 다른 글
[SwiftUI] @escaping에 대해서 (2) | 2022.04.11 |
---|---|
[SwiftUI] Generics 타입 제약 (Type Constraints) 다루기 (0) | 2022.03.20 |
[SwiftUI] ForEach에서 \.self를 사용하는 이유와 id 중복 문제 해결 방법 (0) | 2022.03.13 |
[SwiftUI] json parsing 방법 (0) | 2022.03.10 |
[SwiftUI] View 가독성을 늘리는 3가지 방법 (View 쪼개기) (0) | 2022.03.10 |
[SwiftUI] View protocol과 body 변수에 대한 고찰 (some 키워드를 사용하는 이유) (0) | 2022.02.25 |
[Swift UI] @State에 대한 아주 얕은 고찰 (0) | 2021.11.07 |
[SwiftUI] Swift UI에 대한 첫인상 (2) | 2021.11.07 |