안녕하세요! 릴리입니다:-)
오늘은 객체를 String으로 바꿀 때 커스타마이징된 String으로 바꿀 수 있게 해주는 CustomStringConvertible 프로토콜에 대해 알아보도록 하겠습니다!
애플 개발자 문서의 글(아래 링크)을 참고하여 작성되었습니다😊
📑참고 문서
[Apple Developer Documentaion] CustomStringConvertible
이 프로토콜을 따르는 타입은 인스턴스를 string으로 바꿀 때 자체 정의해둔(coustomized) 표현으로 쓸 수 있습니다.
프로토콜을 구현하는 방법은 타입 내에 인스턴스 프로퍼티(description
)를 정의해줍니다.
var description: String { get }
그러면 CustomStringConvertible 프로토콜을 따르는 타입의 인스턴스를 출력하려하면, description
프로퍼티에서 정의해둔 표현(리턴하는 값)을 가져와서 출력해줍니다.
struct Point {
let x: Int, y: Int
}
let p = Point(x: 21, y: 30)
print(p)
// Prints "Point(x: 21, y: 30)"
extension Point: CustomStringConvertible {
var description: String {
return "(\(x), \(y))" // customized representation
}
}
print(p)
// Prints "(21, 30)"
그런데 주의할 점!
description
프로퍼티에 바로 직접 접근하는 것은 권장되지 않습니다.(p.description
❌)
대신 String(describing:)
이니셜라이져로 접근하는 것이 권장됩니다.
String(describing:)
이니셜라이져는 CustomStringConvertible 프로토콜을 따르는 모든 타입을 인자로 받으며, description
프로퍼티의 리턴값(custom string)으로 초기화합니다.
struct Point: CustomStringConvertible {
let x: Int, y: Int
var description: String {
return "(\(x), \(y))"
}
}
let p = Point(x: 21, y: 30)
let s = String(describing: p) // 프로토콜을 준수하는 인스턴스를 인자값으로 받아 초기화
print(s)
// Prints "(21, 30)"