Coding Log

스위프트 찔러보기 - (8) 제네릭(Generics)

본 블로그에 올라가는 포스팅은 애플의 공식 사이트를 대강 번역해서 작성하는 것이기 때문에 아래 링크에서 찔러보기 포스팅에서 쓸 예제 코드를 받을 수 있다.

참고 애플의 Playground를 이용한 Swift Example 다운로드 링크

제네릭 함수와 타입

제네릭 함수나 타입을 만드려면 홀화살괄호 < > 를 사용한다.

< > 안에 제네릭 함수나 타입의 이름을 삽입하면 된다.

아래의 에제 코드를 보자.

func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
        result.append(item)
    }
    return result
}
makeArray(repeating: "knock", numberOfTimes:4)

제네릭 클래스, 열거형, 구조체

위의 함수나 메소드처럼 클래스, 열거형, 구조체 또한 제네릭 형태로 작성할 수 있다.

// Reimplement the Swift standard library's optional type 
enum OptionalValue<Wrapped> {
    case none
    case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

where 키워드를 활용한 제네릭

where 키워드를 사용하면 특정 요구사항을 충족하도록 코드를 작성할 수 있다.

함수의 선언부 끝에 where 키워드와 함게 조건이 들어가게 된다.

다양한 활용법이 존재하는데 파라미터 타입이 특정 프로토콜을 따르도록 요구하거나, 파라미터들의 유형이 동일해야 하거나, 클래스가 특정 수퍼 클래스를 따르도록 요구할 수 있다.

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
    where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
        for lhsItem in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    return true
                }
            }
        }
        return false
}
anyCommonElements([1, 2, 3], [3])

위의 코드가 조금 복잡하지만 조금씩 뜯어서 살펴보도록 하자.

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U)

anyCommonElements함수는 두 개의 파라미터를 받는 함수이며, 파라미터의 유형은 제네릭으로 선언되었기 때문에 함수가 호출될 때 타입이 결정된다.

<T: Sequence, U: Sequence>

파라미터인 제네릭 타입 T와 U는 Sequence라는 프로토콜을 따른다.

where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element

위의 where문을 하나씩 더 쪼개보도록 하자.

T.Iterator.Element: Equatable

제네릭 파라미터 T의 요소들은 Equatable 프로토콜을 따른다.

T.Iterator.Element == U.Iterator.Element

제네릭 파라미터 T와 U의 Element는 동일해야 한다.

위와 같이 해석할 수 있다.

func simpleWhere<T: Equatable> -> Int {
  //... 
}

위와 같은 함수가 있다고 할때 제네릭 선언부인 <T: Equatable>를 where를 사용해서 작성하면

func simpleWhere<T> -> Int where T:Equatable {
  //... 
}

위와 같다.

DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다