잡초의 일지

[Swift] Generics 제네릭 본문

[코딩] 배우는것/Swift

[Swift] Generics 제네릭

JabCho 2020. 7. 14. 19:17
728x90
반응형
SMALL

Generics 제네릭

Swift 언어는 "타입" 이 있는 언어이다. 그래서 타입이 없는 변수를 가질 수 없다.

하지만, 우리가 어떤 타입이던 신경쓰지 않는 것에 대해 어떻게 명시할 수 있을까?

 

우리는 generics라고 하는 "dont care" 타입을 쓴다. ("dont care" 타입이라고 부르지만, 사실은 type parameter이다.)

 

그 대표적인 예시가 Array이다.

Array는 "배열". 즉, 어떤것들을 모아놓은 것이다. 그리고 그것들이 어떤 타입인지 신경쓰지 않는다.

하지만, Array안에 포함하고 있는 변수가 있다. 그리고 그것들은 타입이 필요하다.

그리고 요소를 추가하기나 요소 받기 같은 것을 하는 Array기능에 대한 매개변수의 타입이 필요하다. 

이때 어떤것을 리턴해야 하는가? 이런것을 제네릭을 사용하여 한다.

 

Array의 정의를 보면, 아래와 같은 형식이다.

struct Array<Element> {
	...
    func append(_ element: Element) { ... }
}

여기서 append에 있는 Element타입이 "dont care" 타입이다. 

Element는 struct나 class나 protocol이 아니다. placeholder for a type이다.

사용자가 Array를 사용하면, 그때 타입이 정해진다. (String이거나 Int이거나...)

 

예제 코드

struct MemoryGame<CardContent> {        // 이렇게 위에서 꺽쇠 표시로 CardContent라는 dont care타입을 썼다고 말해줘야 한다.
    var cards: Array<Card>				// 나중에 MemoryGame을 부를때 <CardContent>자리에 들어가는 자료형으로 어떤 자료형인지 알 수 있다.
    
    func choose(card: Card) {
        print("card chosen: \(card)")
    }
    
    init(numberOfPairsOfCards: Int, cardContentFactory: (Int) -> CardContent){
        cards = Array<Card>()
        for pairIndex in 0..<numberOfPairsOfCards {
            let content = cardContentFactory(pairIndex)
            cards.append(Card(content: content, id: pairIndex*2))
            cards.append(Card(content: content, id: pairIndex*2+1))
        }
    }
    
    struct Card: Identifiable {
        var isFacedUp: Bool = false
        var isMatched: Bool = false
        var content: CardContent			// dont care 타입으로 선언하겠다. 그러려면, 
        var id: Int
    }
}

www.youtube.com/watch?v=4GjXq2Sr55Q&list=PLpGHT1n4-mAtTj9oywMWoBx0dCGd51_yG&index=15

이곳에 나오는 코드이다. 스탠포드 강의를 유튜브로 풀어준다니 정말 행운이다.

728x90
반응형
LIST
Comments