[TIL] Custom String Interpolation

박주하·2025년 6월 25일

String Interpolation (문자열 보간법)


  • Swift에서 문자열을 다룰 때 자주 사용되는 기능 중 하나
  • "Hello, \(name)!"과 같은 방식으로 변수를 문자열에 삽입하는 기능
  • Custom String Interpolation(사용자 정의 문자열 보간법)을 활용하면 보다 강력하고 유연한 문자열 포맷팅 가능

String Interpolation이 동작하는 구조

let name = "Luna"
let greeting = "Hello, \(name)!"

// 문자열 보간은 내부적으로는 이렇게 처리됨
var result = ""
result.append("Hello, ")
result.appendInterpolation(name)
result.append("!")

→ 이때 appendInterpolation(...)을 직접 구현해서 원하는 출력 형식으로 바꾸는 것이 커스터마이징이다!


Custom String Interpolation


  • String.StringInterpolation 프로토콜을 확장하여, 원하는 형태의 보간법을 직접 정의하는 기능
  • 문자열 보간 시 특정한 형식을 자동으로 적용 가능
  • 예: 날짜 형식 변환, 숫자 포맷 지정, JSON 변환 등
  • 보다 직관적이고 가독성이 높은 문자열 변환이 가능
    → 코드의 유지보수성과 가독성이 향상

구현 방법

extension String.StringInterpolation {
    mutating func appendInterpolation(커스텀_메서드_이름: 타입) {
        // 변환 처리
        appendLiteral(변환된 문자열)
    }
}

1. String.StringInterpolation 확장

  • extension String.StringInterpolation 구문을 사용하여 문자열 보간 기능 확장

2. appendInterpolation 메서드 구현

  • mutating func appendInterpolation(_ value: 타입) 형태로 메서드 정의
  • appendInterpolation 메서드 내에서 해당 타입의 값을 원하는 포맷으로 변환하여 문자열에 추가(appendLiteral(...))

3. 사용

  • \(~~) 사이에 원하는 타입의 변수 또는 표현식을 넣어서 문자열 구성
  • appendInterpolation 메서드가 자동으로 호출되어 커스터마이징된 문자열 생성됨

여러 예제들


1. 날짜 포맷

extension String.StringInterpolation {
    mutating func appendInterpolation(_ date: Date, format: DateFormatter.Style = .long, locale: Locale = .current) {
        let formatter = DateFormatter()
        formatter.dateStyle = format
        formatter.locale = locale
        appendLiteral(formatter.string(from: date))
    }
}

print("오늘은 \(Date(), format: .long, locale: Locale(identifier: "en_US"))입니다.")

/*
출력 결과
오늘은 June 25, 2025입니다.
*/

2. 숫자 포맷

extension String.StringInterpolation {
    mutating func appendInterpolation(_ value: Double, digits: Int) {
        let formatted = String(format: "%.\(digits)f", value)
        appendLiteral(formatted)
    }
}

let pi = 3.14159
print("파이: \(pi, digits: 2)") 

/* 
출력 결과
파이: 3.14
*/

3. 개인정보 마스킹 처리

extension String.StringInterpolation {
    mutating func appendInterpolation(masked value: String) {
        let masked = String(repeating: "*", count: value.count - 3) + value.suffix(3)
        appendLiteral(masked)
    }
}

let phone = "01012345678"
print("전화번호: \(masked: phone)")

/* 
출력 결과
전화번호: *******678
*/

4. JSON 문자열 변환

extension String.StringInterpolation {
    mutating func appendInterpolation<T: Encodable>(_ value: T) {
        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        if let jsonData = try? encoder.encode(value), let jsonString = String(data: jsonData, encoding: .utf8) {
            appendLiteral(jsonString)
        } else {
            appendLiteral("(Invalid JSON)")
        }
    }
}

struct User: Codable {
    let name: String
    let age: Int
}

let user = User(name: "Estelle", age: 25)
print("User Data: \(user)")

/*
출력 결과
User Data: { "name": "Estelle", "age": 25 }
*/

0개의 댓글