반응형
- 해당 코드
1
2
3
|
func checkDuplication<T>(_ ary: [T]) -> Bool{
return ary.count != Set(ary).count
}
|
cs |
해당코드의 경우에는 배열을 받아서 중복값이 있는지 확인하는 메서드를 만들려다 생긴 오류다
코드는 간단하게 배열을 받아 Set형식으로 변환해서 Set의 count와 array의 count랑 비교하면
Set의 경우에는 중복 허용이 되지 않아 형변환시 중복값이 있으면 Set에 들어가지 않아 array와 count가 달라지게 된다.
다만 배열에 어떤 타입이 들어갈지 알 수 없으니 제네릭으로 선언을 해놓자 에러가 발생하였다.
- error code
Referencing initializer 'init(_:)' on 'Set' requires that 'T' conform to 'Hashable'
- 원인 해결
1
2
3
|
func checkDuplication<T: Hashable>(_ ary: [T]) -> Bool{
return ary.count != Set(ary).count
}
|
cs |
- 원인
문제는 제네릭 타입의 T에서 발생한다.
Set의 경우에 중복값을 제거하기 위해서 hash를 사용한다.
그렇기 때문에 Set에 저장되는 값들도 전부 hash를 사용할 수 있어야 하는데 hash를 사용할 수 있도록 하는
프로토콜이 Hashable 프로토콜이다.
제네릭의 경우에는 어떠한 타입을 선언하든 Hashable프로토콜을 준수하다는 것을 선언해주면 해당 에러가 사라지게 된다.
반응형