이번 5월 iOS 원티드 프리 온보딩을 들으면서 CustomDebugStringConvertible
프로토콜에 대해 알게 되었는데
생각보다 활용도가 높고 debugPrint
라는 함수도 알게되어 정리를 하게 되었다.
우리가 기존에 쓰던 print
문은 print
문 내의 우리가 예상하는 출력 결과를 출력한다.
예를 들어
print("hello")
라면 결과값은 hello
를 예상하고 출력하는 것이며 출력 결과 또한 같다.
그러나 debugPrint
는 우리가 생각하는 것보다 많은 정보를 출력할때 즉, 디버깅할 때의 용도로 사용하기 위한 print
문이라고 할 수 있다.
예를 들어
debugPrint("hello")
같은 값을 출력했을때 결과값은 hello
가 아닌 "hello"
가 출력되게 된다.
또 다른 예시로 아래와 같은 범위를 출력할때
var numbers = 1...5
위와 같이 print
문은 1…5
의 변수 범위 자체를 출력하고
debugPrint
문은 1…5
ClosedRange
라는 범위의 정보까지를 출력하는 것을 확인할 수 있다.
따라서 디버깅 시에는 debugPrint
문을 활용하면 출력되는 내용뿐만 아니라 내용의 성질, 정보까지도 출력할 수 있어 더욱 효과적이다.
또한 debugPrint
는 일반 print
문과 마찬가지로
separator
와 terminator
를 파라미터로 가지고 있으며 활용할 수 있다.
이 글을 쓰게 된 계기이자 debugPrint
에 대해 알게된 계기? 이다.
라고 한 마디로 정리할 수 있다.
예를 들어
위와 같은 구조체 객체를 출력하면 아래처럼 구조체 객체 자체가 출력되지만
CustomStringConvertible
프로토콜을 선언하고
description
연산 프로퍼티에서 원하는 문자열 값을 리턴하도록 하면
이때
description
이라는 연산 프로퍼티를 필수로 구현하여 리턴될 문자열을 정의하도록 해야한다.
또한CustomDebugStringConvertible
의 경우description
이 아닌debugDescription
이라는 연산 프로퍼티를 구현하며 방식은 위와 같다.
객체를 출력했을 때 개발자가 직접 지정한 문자열을 출력하는 것을 확인할 수 있다.
debugPrint
와 print
를 봤다면 알겠지만 차이점은
debugPrint
에서만 CustomDebugStringConvertible
프로토콜을 통해 반환한 문자열이 출력된다.print
에서만 CustomStringConvertible
프로토콜을 통해 반환한 문자열이 출력된다.따로 쓰게되면 상관없이 출력된다.
여기서 조금 신기한 점은 “debugPrint : 5 입니다.”
라는 문자열이라는 정보가 포함된 출력을 예상하였는데 일반 print
문과 같다는 점이었다.
공식문서에서 찾아본 바로는
명확하게 나오지는 않았지만
CustomDebugStringConvertible
의 목적이 디버깅 문자열을 반환하기 위한 목적이기 때문에 일반 문자열과는 다르게 디버깅 타입을 정의하는 것이 아닌 이미 구현된 디버깅 문자열을 그대로 출력하기 때문이다.
따라서 일반 문자열이 출력될때 큰 따옴표가 같이 출력되지만(디버깅 문자열) 디버깅 문자열은 이미 디버깅을 위한 문자열이기 때문에 디버깅 문자열 자체만 출력된다.
다시 정리하면
CustomDebugStringConvertible
을 통해 반환되는 문자열은 이미 디버깅 문자열이기 때문에 debugPrint
를 통해 출력해도 디버깅 정보를 표시하지 않는다.아래의 프로젝트에서 활용해보았고 PR로 남겨두었다.
https://github.com/TaekH/Wanted_PreOnboarding_MyCreditManager/pull/2
https://developer.apple.com/documentation/swift/debugprint(_:separator:terminator:)/
https://developer.apple.com/documentation/swift/customdebugstringconvertible
https://developer.apple.com/documentation/swift/customstringconvertible