Swift의 Numeric
프로토콜은 숫자 연산이 가능한 타입(Int
, Double
, Float
등)에 적용됩니다.
즉, +
, -
, *
같은 산술 연산을 지원하는 타입만 이 프로토콜을 채택할 수 있습니다.
대표적인 Numeric
준수 타입:
Int
Float
Double
String
은 숫자가 아니므로 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
이 필요하지 않다.