CustomStringConvertible 프로토콜은
객체를 String으로 변환해서 표현하고 싶을 때 사용하는 프로토콜로, 주로 print()함수를 통해 출력할 때 유용합니다.
정의를 보면 description 계산 프로퍼티를 구현하도록 되어 있는 것을 확인할 수 있습니다.
예제에서는 Point 구조체를 CustomStringConvertible 프로토콜을 구현하여, print()함수 호출시 출력할 String을 정의해주었습니다.
사실 구조체는 CustomStringConvertible을 구현하지 않아도 어느 정도 String으로 변환해서 보여줍니다.
아래는 Almond 구조체입니다. print했을 때, 객체의 타입과 프로퍼티 값들을 보여줍니다.
struct Almond {
var name: String
var yummy: Bool
}
let someAlmond = Almond(name: "Mint Choco", yummy: false)
print(someAlmond) // Almond(name: "Mint Choco", yummy: false)
아래는 Almond 클래스입니다. 구조체였을 때와 달리 출력했을 때 의도하지 않은 String이 출력됩니다.
class Almond {
var name: String
var yummy: Bool
init(name: String, yummy: Bool) {
self.name = name
self.yummy = yummy
}
}
let someAlmond = Almond(name: "Mint Choco", yummy: false)
print(someAlmond) // __lldb_expr_281.Almond
이럴 때, CustomStringConvertible을 구현해주면 원하는 String으로 해당 클래스의 객체를 표현해줄 수 있게 됩니다.
extension Almond: CustomStringConvertible {
var description: String {
return "\(name), \(yummy ? "Yummy!" : "Nope!")"
}
}
let someAlmond = Almond(name: "Mint Choco", yummy: false)
print(someAlmond) // Mint Choco, Nope!