Numeric 프로토콜

Ios_Roy·2025년 8월 20일
0

TIL

목록 보기
20/25
post-thumbnail

1. Numeric 프로토콜 설명

Swift의 Numeric 프로토콜은 숫자 연산이 가능한 타입(Int, Double, Float 등)에 적용됩니다.
즉, +, -, * 같은 산술 연산을 지원하는 타입만 이 프로토콜을 채택할 수 있습니다.

  • 대표적인 Numeric 준수 타입:

    • Int
    • Float
    • Double
  • String은 숫자가 아니므로 Numeric을 따를 수 없음 → 따라서 제네릭 제약 조건이 잘못됨.


2. 올바른 제네릭 제약 조건

문제는 짝수 인덱스를 제거하는 로직숫자 연산과는 관련이 없다는 점입니다.
따라서 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]

removeEvenIndex 트러블슈팅 (with Numeric)

개요

Swift에서 배열의 짝수 인덱스 요소를 제거하는 유틸리티 함수를 구현하는 과정에서,
Static method 'removeEvenIndex' requires that 'String' conform to 'Numeric' 오류가 발생했습니다.
이 문서는 해당 문제를 분석하고, 해결 방안을 정리한 문서입니다.


3. 문제 상황

다음과 같이 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'

4. 트러블슈팅 요약

  • ❌ 문제 원인: 제네릭 타입 T: Numeric 제약 → StringNumeric을 따르지 않음
  • ✅ 해결 방법: Numeric 제약을 제거하고, 단순히 제네릭 T로 선언
  • 📌 교훈: 제네릭 제약 조건은 꼭 필요한 경우에만 추가할 것

5. 결론

  • Numeric은 숫자 타입만을 위한 프로토콜이다.
  • 배열 인덱스 연산에는 Numeric이 필요하지 않다.
  • 제네릭 제약을 제거하면, 모든 타입에서 짝수 인덱스를 제거하는 유틸리티 함수를 만들 수 있다.
profile
iOS 개발자 공부하는 Roy

0개의 댓글