프로토콜을 준수하도록 확장을 제네릭 형식에 적용하는 방법이 있습니까?이 확장은 제네릭 형식의 특정 특수화에만 유효합니다.일반 유형의 일부 특수화에만 확장을 적용하는 방법은 무엇입니까?
예를 들어, 상기 프로토콜에 따르는 인스턴스에 포함 된 값의 빈도 카운트 사전 리턴이 프로토콜 고려해
// a type conforming to this protocol should return a dictionary
// which counts the frequencies of values contained by the type instance
protocol ConvertibleToFrequencyDictionary {
typealias ItemType
func dictionaryCountingFrequencies<ItemType:Hashable>() -> Dictionary<ItemType,Int>
}
을하기 때문에 사전에 키로서 기능한다 계산되는 값으로, 값 Hashable을 준수하는 유형이어야합니다. 이것은 일반 dictionaryCountingFrequencies
메소드의 정의에 대한 유형 제약 조건으로 표현됩니다. ("typealias"선언과 같은 연관된 유형에 유형 제약 조건을 직접 정의 할 수있는 방법이 없습니다.)
이제 프로토콜에 맞게이 확장을 Array로 간주합니다.
extension Array : ConvertibleToFrequencyDictionary {
typealias ItemType=Element
func dictionaryCountingFrequencies<ItemType:Hashable>() -> Dictionary<ItemType,Int> {
var valueToCount = Dictionary<ItemType,Int>()
for item in self {
if let existingCount = valueToCount[item] {
valueToCount.updateValue(value: existingCount + 1, forKey: item)
} else {
valueToCount.updateValue(value: 1, forKey: item)
}
}
return valueToCount;
}
}
이 값은 Array에 나타나는 모든 고유 값의 빈도를 반환해야합니다. 물론 이러한 값은 해시 가능해야하므로이 확장은 Array<T:Hashable>
에 적용될 때만 작동해야합니다.
그러나 Int는 Hashable 임에도 불구하고 Array<Int>
에서는 작동하지 않습니다.
왜 안 되니? 제네릭 형식의 확장을 작성하는 경우 해당 확장이 제네릭 형식의 모든 가능한 특수화에 대해 작동 할 수 있어야합니까?