Swift의 Numeric 프로토콜은 숫자 연산이 가능한 타입(Int, Double, Float 등)에 적용됩니다.
즉, +, -, * 같은 산술 연산을 지원하는 타입만 이 프로토콜을 채택할 수 있습니다.
대표적인 Numeric 준수 타입:
IntFloatDoubleString은 숫자가 아니므로 Numeric을 따를 수 없음 → 따라서 제네릭 제약 조건이 잘못됨.
문제는 짝수 인덱스를 제거하는 로직이 숫자 연산과는 관련이 없다는 점입니다.
따라서 Numeric 제약은 불필요하며, Any 혹은 Equatable 정도면 충분합니다.
struct ArrayIndex {
static func removeEvenIndex<T>(_ array: [T]) -> [T] {
return array.enumerated().compactMap { index, element in
return index % 2 == 1 ? element : nil
}
}
}
이제 String, Int 등 모든 타입의 배열에서 사용할 수 있습니다.
let filteredStrings = ArrayIndex.removeEvenIndex(["가", "나", "다", "라", "마"])
// ✅ ["나", "라"]
let filteredInts = ArrayIndex.removeEvenIndex([1, 2, 3, 4, 5])
// ✅ [2, 4]
Swift에서 배열의 짝수 인덱스 요소를 제거하는 유틸리티 함수를 구현하는 과정에서,
Static method 'removeEvenIndex' requires that 'String' conform to 'Numeric' 오류가 발생했습니다.
이 문서는 해당 문제를 분석하고, 해결 방안을 정리한 문서입니다.
다음과 같이 removeEvenIndex 메서드를 정의했을 때:
struct ArrayIndex {
static func removeEvenIndex<T: Numeric>(_ array: [T]) -> [T] {
return array.enumerated().compactMap { index, element in
return index % 2 == 1 ? element : nil
}
}
}
String 배열을 넣으면 컴파일 오류가 발생했습니다.
let filtered = ArrayIndex.removeEvenIndex(["가", "나", "다", "라", "마"])
// ❌ Static method 'removeEvenIndex' requires that 'String' conform to 'Numeric'
T: Numeric 제약 → String은 Numeric을 따르지 않음 Numeric 제약을 제거하고, 단순히 제네릭 T로 선언 Numeric은 숫자 타입만을 위한 프로토콜이다. Numeric이 필요하지 않다.