HeonDev

Swift Advanced

inout

파라미터에 참조 변수를 사용하는 문법. C언어로 치면 파라미터에 포인터를 할당한 것과 비슷하다.

특징 Thread-Safe 하므로 이 함수의 작업 중에 다른 스레드에서 이 파라미터(주소)의 값을 변경할 수 없다.

Example Code 아래는 a와 b를 스왑하는 함수인데 inout 참조를 통해 스왑이 가능하다. (메모리 주소값을 참조 하는 것)

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}


// 사용 예제
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt) // & 를 통해 주소를 참조한다. 

inout 참고자료 Functions - Inout Parameters

Generics

어떠한 로직이 있을 때 타입 또는 프로토콜에 상관없이 재사용가능한 코드.

Generic 미사용의 경우 같은 로직의 메소드를 타입마다 오버로딩 해주어야한다. (오버로딩: 같은 이름의 함수를 동일하지 않은 파라미터로 여러개 구현 하는 것)

func swapTwoStrings(_ a: inout String, _ b: inout String) {
    let temporaryA = a
    a = b
    b = temporaryA
}


func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

Generic을 사용하면 메소드 하나로 타입에 상관없이 사용할 수 있다.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

명명 Type의 첫글자인 T, U, V … 이렇게 짓는 것이 관용적이고, 두 이름의 관계가 있는경우 Swift의 *Dictionary* *Array* 와 같은 일반적인 이름을 사용한다. **Generics 참고자료** [Swift Generics](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics)

Tagged with: