[IOS 로드맵] Generics

2392 단어 로드맵로드맵

Generics

제네릭은 swift에서 유연하고 재사용 가능하게 해주는 코드 활용인데
중복사용을 피하게 해주고 명확하지만 추상적인 코딩을 가능하게 해준다
제네릭의 예제를 살펴보면서 이해해보자

제네릭을 코드로 이해하자

아래는 일반적인 swap코드입니다.

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

이렇게 작성하면 input으로 Int만 받을 수 있으니 Double이나 Float, String등등 다른 형식에 사용하려면 추가적인 함수를 아래 줄줄이 기재하고 비슷한 코드들이 줄줄이 이어지는데
제네릭을 활용하면 이를 해결할 수 있습니다.

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

여기서 T는 무엇일까

Type Parameters
함수 이름뒤에 작성되며 함수가 호출될 때마다 실제 타입으로 즉시 대체됩니다.
이 덕에 위에서 보듯이 변수 타입과 상관없이 다른타입이여도 하나의 함수로 재사용 할 수 있게 되죠

Dictionary<Key, Value>, Array<Element> 처럼 <>안에 T를 대체하는 이름으로 설명이 붙지만 큰 의미가 없는 경우는 T나 U를 사용합니다.

사용자 정의 제네릭 활용

struct IntStack {
    var items: [Int] = []
    mutating func push(_ item: Int) {
        items.append(item)
    }
    mutating func pop() -> Int {
        return items.removeLast()
    }
}

일반적으로 작성한 Int형 스택입니다
이것을 제네릭으로 변환하면

struct Stack<Element> {
    var items: [Element] = []
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

제네릭 버전의 스택인데 이를 활용하는 코드는

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
// the stack now contains 4 strings

이런식으로 제네릭은 어디 하나에서 국한되는게 아닌 다양하게 활용 할 수 있습니다.

공식 가이드 : https://docs.swift.org/swift-book/LanguageGuide/Generics.html

좋은 웹페이지 즐겨찾기