[swift] 제네릭 타입의 타입 제약에 대해 설명해주세요.

예를 들어, 특정 프로토콜을 준수하는 타입만을 제네릭 인자로 받기 위해서는 타입 제약을 사용할 수 있습니다. 다음은 Equatable 프로토콜을 준수하는 타입만을 제네릭으로 받는 함수의 예시입니다.

func compare<T: Equatable>(value1: T, value2: T) -> Bool {
    return value1 == value2
}

위의 예시에서 <T: Equatable> 구문은 T가 Equatable 프로토콜을 준수하는 타입이어야 한다는 제약을 나타냅니다.

타입 제약은 코드 안정성을 높이고 잘못된 타입이 사용되는 것을 방지하는 데 도움을 줄 수 있습니다. 추가로, 타입 제약을 통해 더욱 유연하고 안정적인 제네릭 코드를 작성할 수 있습니다.