Swift

기본 문법 <제네릭>

pockpock 2024. 6. 15. 22:33
Swift 제네릭 정리

Swift에서 제네릭은 코드 재사용성을 높이고, 타입에 독립적인 함수, 구조체, 클래스, 열거형 등을 작성할 수 있게 해준다.

제네릭 함수

제네릭 함수는 타입 매개변수를 사용하여 다양한 타입에 대해 동작하는 함수를 작성할 수 있게 해준다.

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

 

제네릭 타입

제네릭 타입은 구조체, 클래스, 열거형에서 사용되어 다양한 타입에 대해 동작하는 타입을 정의할 수 있게 해준다.

//제네릭 구조체
struct Stack<Element> {
    var items = [Element]()
    
    mutating func push(_ item: Element) {
        items.append(item)
    }
    
    mutating func pop() -> Element {
        return items.removeLast()
    }
}
//제네릭 클래스
class Box<T> {
    var value: T
    
    init(value: T) {
        self.value = value
    }
}
//제네릭 열거형
enum Result<Value> {
    case success(Value)
    case failure(Error)
}

타입 제약

타입 제약은 제네릭 타입이 특정 프로토콜을 준수해야 함을 명시해준다.

func findIndex<T: Equatable>(of valueToFind: T, in array: [T]) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

연관 타입

연관 타입은 프로토콜에서 제네릭 타입을 정의할 때 사용한다.

protocol Container {
    associatedtype Item
    
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(i: Int) -> Item { get }
}

제네릭 서브스크립트

제네릭 서브스크립트는 서브스크립트에 제네릭을 사용할 수 있게 해준다.

extension Dictionary {
    subscript<Index: Hashable>(index: Index) -> Value? {
        get {
            return self[index as! Key]
        }
        set {
            self[index as! Key] = newValue
        }
    }
}