"Hello, \(name)!"과 같은 방식으로 변수를 문자열에 삽입하는 기능let name = "Luna"
let greeting = "Hello, \(name)!"
// 문자열 보간은 내부적으로는 이렇게 처리됨
var result = ""
result.append("Hello, ")
result.appendInterpolation(name)
result.append("!")
→ 이때 appendInterpolation(...)을 직접 구현해서 원하는 출력 형식으로 바꾸는 것이 커스터마이징이다!
String.StringInterpolation 프로토콜을 확장하여, 원하는 형태의 보간법을 직접 정의하는 기능extension String.StringInterpolation {
mutating func appendInterpolation(커스텀_메서드_이름: 타입) {
// 변환 처리
appendLiteral(변환된 문자열)
}
}
extension String.StringInterpolation 구문을 사용하여 문자열 보간 기능 확장mutating func appendInterpolation(_ value: 타입) 형태로 메서드 정의appendInterpolation 메서드 내에서 해당 타입의 값을 원하는 포맷으로 변환하여 문자열에 추가(appendLiteral(...))\(~~) 사이에 원하는 타입의 변수 또는 표현식을 넣어서 문자열 구성appendInterpolation 메서드가 자동으로 호출되어 커스터마이징된 문자열 생성됨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입니다.
*/
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
*/
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
*/
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 }
*/