TIL: 멤버의 확장(중첩 타입)

Royce·2025년 3월 24일

Swift 문법

목록 보기
45/63

멤버의 확장(중첩 타입)

  • 확장을 사용하여 기존 타입(클래스, 구조체, 열거형)에 새로운 중첩 타입(열거형, 구조체, 클래스 등) 을 추가할 수 있다
  • 기존 타입의 소스 코드를 수정하지 않고도 의미 있고 기능적인 구조를 제공할 수 있다
  • 중첩 타입의 사용은 코드의 가독성과 유지보수성을 향상시키는 데 도움이 된다

중첩 타입 확장의 예시 (예시: String 타입에 중첩 열거형 추가)

// String 타입을 확장하여 중첩 열거형을 추가하기
extension String {

    /// 문자열의 상태를 표현하는 중첩 열거형
    enum StateCategory {
        case empty         // 문자열이 비어 있는 경우
        case numeric        // 숫자로만 구성된 경우
        case alphabetic     // 알파벳으로만 구성된 경우
        case alphanumeric   // 숫자와 알파벳이 혼합된 경우
        case other          // 그 외의 경우 (특수문자 포함 등)
    }
    
    /// 문자열의 상태를 판별하는 계산 속성
    var state: StateCategory {
        if self.isEmpty {
            return .empty
        } else if self.rangeOfCharacter(from: .letters) != nil && self.rangeOfCharacter(from: .decimalDigits) != nil {
            return .alphanumeric
        } else if self.rangeOfCharacter(from: .letters) != nil {
            return .alphabetic
        } else if self.rangeOfCharacter(from: .decimalDigits) != nil {
            return .numeric
        } else {
            return .other
        }
    }
}
  • extension String: 기존 String 타입을 확장하여 중첩 타입을 추가
  • enum StateCategory: 문자열의 상태를 분류하는 열거형 정의
    .empty: 문자열이 비어 있는 경우
    .numeric: 숫자로만 구성된 경우
    .alphabetic: 알파벳으로만 구성된 경우
    .alphanumeric: 숫자와 알파벳이 혼합된 경우
    .other: 그 외의 경우 (특수문자 포함 등)
  • var state: 계산 속성으로, 문자열의 상태를 분류하여 반환
    isEmpty: 문자열이 비어 있는지 확인
    rangeOfCharacter(from:): 특정 문자 집합이 포함되어 있는지 확인

사용 예시

let text1 = "HelloWorld"
print(text1.state)   // 출력: alphabetic

let text2 = "12345"
print(text2.state)   // 출력: numeric

let text3 = "Hello123"
print(text3.state)   // 출력: alphanumeric

let text4 = ""
print(text4.state)   // 출력: empty

let text5 = "!@#"
print(text5.state)   // 출력: other

중첩 타입 확장의 활용 - 함수 구현

// 문자열 배열의 상태를 출력하는 함수 구현하기
func printStringStates(_ texts: [String]) {
    for text in texts {
        switch text.state {   // String 타입의 state 계산 속성 사용
        case .empty:
            print("E ", terminator: "")
        case .numeric:
            print("N ", terminator: "")
        case .alphabetic:
            print("A ", terminator: "")
        case .alphanumeric:
            print("AN ", terminator: "")
        case .other:
            print("O ", terminator: "")
        }
    }
    print("")
}

// 함수 실행 예시
printStringStates(["Hello", "123", "Swift2025", "", "!@#", "World"])   // 출력: A N AN E O A
  • printStringStates(_:): 문자열 배열을 입력받아 각 문자열의 상태를 출력하는 함수
  • text.state: String 타입의 중첩 열거형 StateCategory를 사용하여 문자열의 상태 확인
  • switch: 각 상태에 따라 A, N, AN, E, O 등을 출력
  • terminator: "": 출력 결과를 한 줄로 표시하기 위해 사용

요약

  • 중첩 타입 확장(Nested Type Extension): 기존의 클래스, 구조체, 열거형에 새로운 중첩 타입(열거형, 구조체, 클래스 등) 을 추가할 수 있다
  • 특징
    • 기존 타입의 기능을 확장하여 새로운 의미와 구조를 정의할 수 있다
    • 기존 타입의 코드 수정 없이 새로운 타입을 추가 가능하다
    • 중첩 타입은 외부에서 기존타입.새로운타입 형식으로 접근할 수 있다
  • 사용 예시
    String 타입에 중첩 열거형 StateCategory를 추가하여 문자열의 상태를 분류하고 기능을 확장하였다
  • 장점
    • 기존 타입의 기능을 확장하는 강력한 방법
    • 가독성과 유지보수성이 개선됨
    • 코드의 의미를 더 명확하게 표현할 수 있음
profile
iOS 개발자 지망생

0개의 댓글