func print(
_ items: Any...,
separator: String = " ",
terminator: String = "\n"
)
print(Character("G"))
print("S")
print(3.14)
어떤 값이든 print를 사용하면 값이 출력된다.
모든 타입의 항목을 받아 텍스트 표현으로 출력한다고 하는데,
커스텀 구조체/클래스에서도 CustomStringConvertible을 채택하지 않았는데, 값이 출력되는 원리가 궁금해서 찾아봤다.
print는 내부적으로 String(describing:)
을 호출한 결과와 같다고 한다.
그렇다면 String(describing:)
은 무엇이냐?
struct Point {
let x: Int, y: Int
}
let p = Point(x: 21, y: 30)
print(String(describing: p))
// Prints "Point(x: 21, y: 30)"
extension Point: CustomStringConvertible {
var description: String {
return "(\(x), \(y))"
}
}
print(String(describing: p))
// Prints "(21, 30)"
String(describing:)
은 말 그대로 객체를 텍스트로 출력해 주는 메서드이다.
여기서 드는 의문점은 그럼 String(describing:)
은 어떤 방식으로 객체를 텍스트로 전환해주는가? 였는데
아래와 같은 원리로 동작한다고 한다.
모든 타입의 인스턴스를 문자열로 변환하는 메서드. 프로토콜 적합성에 따라 다음 방법 중 하나로 문자열 표현을 생성
- 인스턴스가 TextOutputStreamable 프로토콜을 준수: 빈 문자열 s에 instance.wirte(to: s)를 호출한 결과
- 인스턴스가 CustomStringConvertible 프로토콜을 준수: instance.description을 호출한 결과
- 인스턴스가 CustomDebugStringConvertible 프로토콜을 준수: instance.debugDescription을 호출한 결과
- 그 외에는 Swift 표준 라이브러리에 의해 자동으로 제공
print가 이러한 방식으로 동작한다고 하면, dump는 어떠한 방식인가?
dump는 출력을 위해 mirror를 사용
참고
https://developer.apple.com/documentation/swift/print(_:separator:terminator:)
https://developer.apple.com/documentation/swift/dump(_:name:indent:maxdepth:maxitems:)
https://developer.apple.com/documentation/swift/string/init(describing:)-588wb
https://developer.apple.com/documentation/swift/mirror
'Swift' 카테고리의 다른 글
주니어 iOS 개발자 Swift 면접 질문 (0) | 2025.04.23 |
---|---|
Swift: add, adds, append, appends 속도 비교 (0) | 2025.03.30 |
Swift: add, append 속도 비교 (0) | 2025.03.30 |
Swift: if let, guard let 속도 비교 (0) | 2025.03.30 |
Swift: async let 수행 순서 (0) | 2025.03.30 |