[IOS 로드맵] Generics

willis18·2021년 9월 30일
0

IOS 로드맵

목록 보기
23/109

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

0개의 댓글