공식 문서
https://developer.apple.com/documentation/swift/customstringconvertible
CustomStringConvertible | Apple Developer Documentation
A type with a customized textual representation.
developer.apple.com
Swift의 CustomStringConvertible 프로토콜은 커스텀된 텍스트 표현을 사용할 수 있도록 해주는 프로토콜임

개요
CustomStringConvertible 프로토콜을 준수하는 타입은 인스턴스를 문자열로 변환할 때 그 타입만의 자체 표현을 제공할 수 있다.
만약 CustomStringConvertible 프로토콜을 준수하는 인스턴스가 String(describing:) 이니셜라이저나 print(_:) 함수의 인자로 전달되면 해당 이니셜라이저와 함수는 인스턴스의 description 프로퍼티를 사용한다.
(description 프로퍼티에 직접 접근하거나 CustomStringConvertible을 제네릭 타입 제약에 사용하는 것은 권장되지 않음)
👉 즉, 타입 자체를 원하는 형식의 문자열로 바로 표현하고 싶을 때 사용할 수 있는 프로토콜인 것 같다.
description 프로퍼티에 직접 접근하는 것을 권장하지 않는 이유는 이렇게 사용할 경우 굳이 CustomStringConvertible 프로토콜을 채택할 필요 없이 그냥 연산 프로퍼티를 추가하면 되기 때뭉에 용도를 구분해주고자 그런게 아닐까 싶다.
CustomStringConvertible 프로토콜 준수하기
description 프로퍼티를 정의해주는 것으로 CustomStringConvertible 프로토콜을 준수할 수 있다.
공식 문서의 예제를 보면 CustomStringConvertible 프로토콜을 준수하지 않을 때는 Point 구조체를 print() 시에 구조체가 그대로 나오지만, Point 구조체가 CustomStringConvertible 프로토콜을 준수할 때는 print() 시에 자동으로 description 프로퍼티에 정의된 형식으로 출력되는 것을 볼 수 있다.
// MARK: - CustomStringConvertible 프로토콜 준수 x
struct Point {
let x: Int, y: Int
}
let p = Point(x: 21, y: 30)
print(p)
// Prints "Point(x: 21, y: 30)"
// MARK: - CustomStringConvertible 프로토콜 준수
extension Point: CustomStringConvertible {
var description: String {
return "(\(x), \(y))"
}
}
print(p)
// Prints "(21, 30)"
적용해보기
CustomStringConvertible 프로토콜을 직접 적용해보았다.
- 지하철 도착 정보에 대한 구조체인 ArrivalInfo의 restTime 프로퍼티는 초 단위로 값을 받아오기 때문에 00분00초 형식으로 표현을 해주어야 한다.
struct ArrivalInfo {
var restTime: RestTimeSecond // 남은 시간 (단위: 초)
var prevStation: String // 이전역
var nextStation: String // 다음역
var station: String // 현재역
}
- CustomStringConvertible 프로토콜을 준수하는 RestTimeSecond라는 타입을 정의해서 초 단위로 표현된 Int 값을 "00분00초" 의 String으로 표현해주도록 description 프로퍼티를 정의해주었다.
struct RestTimeSecond: CustomStringConvertible {
var second: Int
var description: String {
return "\(second/60)분\(second%60)초"
}
}
- 이후 실시간 정보를 받아와서 텍스트로 표시하도록 코드를 작성해주었다.
self?.subwayView.timeLabel.text = "\(arrivalInfoList[1].restTime) 남았습니다."
- 공식 문서의 설명에서 String(describing:) 이니셜라이저 사용 시에 description 프로퍼티가 적용이 된다고 했기 때문에 문자열 보간 시에도 적용이 되지 않을까 싶어서 사용해봤는데 적용된다 ㅎㅎ

'iOS' 카테고리의 다른 글
[iOS] 외국 밈(meme)에서 많이 쓰는 폰트 적용해보기 (SwiftUI) (0) | 2024.04.18 |
---|---|
[iOS] M1 맥북 + Xcode 15 환경에서 SwiftLint 적용 시 오류 처리 (0) | 2024.02.28 |
[ iOS ] String → URL 변환 시 nil이 반환되는 문제 (0) | 2024.02.12 |
[ iOS ] 팀 작업 시에 Bundle Identifier 하나로 공유하기 (0) | 2023.08.27 |
[ iOS ] Watch Connectivity 사용해보기 (0) | 2023.08.08 |
공식 문서
https://developer.apple.com/documentation/swift/customstringconvertible
CustomStringConvertible | Apple Developer Documentation
A type with a customized textual representation.
developer.apple.com
Swift의 CustomStringConvertible 프로토콜은 커스텀된 텍스트 표현을 사용할 수 있도록 해주는 프로토콜임

개요
CustomStringConvertible 프로토콜을 준수하는 타입은 인스턴스를 문자열로 변환할 때 그 타입만의 자체 표현을 제공할 수 있다.
만약 CustomStringConvertible 프로토콜을 준수하는 인스턴스가 String(describing:) 이니셜라이저나 print(_:) 함수의 인자로 전달되면 해당 이니셜라이저와 함수는 인스턴스의 description 프로퍼티를 사용한다.
(description 프로퍼티에 직접 접근하거나 CustomStringConvertible을 제네릭 타입 제약에 사용하는 것은 권장되지 않음)
👉 즉, 타입 자체를 원하는 형식의 문자열로 바로 표현하고 싶을 때 사용할 수 있는 프로토콜인 것 같다.
description 프로퍼티에 직접 접근하는 것을 권장하지 않는 이유는 이렇게 사용할 경우 굳이 CustomStringConvertible 프로토콜을 채택할 필요 없이 그냥 연산 프로퍼티를 추가하면 되기 때뭉에 용도를 구분해주고자 그런게 아닐까 싶다.
CustomStringConvertible 프로토콜 준수하기
description 프로퍼티를 정의해주는 것으로 CustomStringConvertible 프로토콜을 준수할 수 있다.
공식 문서의 예제를 보면 CustomStringConvertible 프로토콜을 준수하지 않을 때는 Point 구조체를 print() 시에 구조체가 그대로 나오지만, Point 구조체가 CustomStringConvertible 프로토콜을 준수할 때는 print() 시에 자동으로 description 프로퍼티에 정의된 형식으로 출력되는 것을 볼 수 있다.
// MARK: - CustomStringConvertible 프로토콜 준수 x
struct Point {
let x: Int, y: Int
}
let p = Point(x: 21, y: 30)
print(p)
// Prints "Point(x: 21, y: 30)"
// MARK: - CustomStringConvertible 프로토콜 준수
extension Point: CustomStringConvertible {
var description: String {
return "(\(x), \(y))"
}
}
print(p)
// Prints "(21, 30)"
적용해보기
CustomStringConvertible 프로토콜을 직접 적용해보았다.
- 지하철 도착 정보에 대한 구조체인 ArrivalInfo의 restTime 프로퍼티는 초 단위로 값을 받아오기 때문에 00분00초 형식으로 표현을 해주어야 한다.
struct ArrivalInfo {
var restTime: RestTimeSecond // 남은 시간 (단위: 초)
var prevStation: String // 이전역
var nextStation: String // 다음역
var station: String // 현재역
}
- CustomStringConvertible 프로토콜을 준수하는 RestTimeSecond라는 타입을 정의해서 초 단위로 표현된 Int 값을 "00분00초" 의 String으로 표현해주도록 description 프로퍼티를 정의해주었다.
struct RestTimeSecond: CustomStringConvertible {
var second: Int
var description: String {
return "\(second/60)분\(second%60)초"
}
}
- 이후 실시간 정보를 받아와서 텍스트로 표시하도록 코드를 작성해주었다.
self?.subwayView.timeLabel.text = "\(arrivalInfoList[1].restTime) 남았습니다."
- 공식 문서의 설명에서 String(describing:) 이니셜라이저 사용 시에 description 프로퍼티가 적용이 된다고 했기 때문에 문자열 보간 시에도 적용이 되지 않을까 싶어서 사용해봤는데 적용된다 ㅎㅎ

'iOS' 카테고리의 다른 글
[iOS] 외국 밈(meme)에서 많이 쓰는 폰트 적용해보기 (SwiftUI) (0) | 2024.04.18 |
---|---|
[iOS] M1 맥북 + Xcode 15 환경에서 SwiftLint 적용 시 오류 처리 (0) | 2024.02.28 |
[ iOS ] String → URL 변환 시 nil이 반환되는 문제 (0) | 2024.02.12 |
[ iOS ] 팀 작업 시에 Bundle Identifier 하나로 공유하기 (0) | 2023.08.27 |
[ iOS ] Watch Connectivity 사용해보기 (0) | 2023.08.08 |