[iOS] Print Override (Print 재정의 하기)

  [iOS] Print Override (Print 재정의 하기)


안녕하세요. 이번에 Print 문의 재정의 부분에 대한 코드 공유하려고합니다.
기존의 Objective C 언어부터 진행하셨던 개발자분들은 NSLog를 .pch 파일에 재정의하여 사용하시는 분들이 많은데요.

  NSLog

#ifdef DEBUG
#define NSLog( s, ... ) NSLog( @"<%@:(%d)> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define NSLog( s, ... )
#endif


위 그림과 같이 [시간] [프로젝트명] <클래스명:(라인)> 내용 으로 출력이 가능합니다.



  Print

/// 2019. 12. 18 Kimjiwook
/// Print문 재 정의 하여 사용함
/// - Parameters:
///   - items: 출력시 사용될 내용
///   - separator: 여러 아이템일 경우 아이템 사이사이 넣을 값
///   - terminator: ...
///   - file: 해당파일이름 (알아서 넣어줌)
///   - line: 해당파일의 라인수 (알아서 넣어줌)
///   - function: 해당파일의 호출된 함수 (알아서 넣어줌)
public func printDZ(_ items: Any..., separator: String = " ", terminator: String = "\n", file: String = #file, line: Int = #line, function: String = #function) {
    let output = items.map { "\($0)" }.joined(separator: separator)
    #if DEBUG
    // 디버그일때만 해당 함수 진행해주기.
    let filePath = URL(fileURLWithPath: file).pathComponents.last
    
    // 시간설정
    let format = DateFormatter()
    format.locale = Locale(identifier: "ko_KR")
    format.dateFormat = "YYYY-MM-dd a hh:mm:ss.SSS"
    
    // [출력형식]
    // [시간] <클래스명:(라인) 함수명> : 출력문
    let printString = "[\(format.string(from: Date()))] <\(filePath!):(\(line)) \(function)> : \(output)"
    Swift.print(printString, terminator: terminator)
    #else
    
    // 릴리즈 버전일때
    let printString = output
    Swift.print(printString, terminator: terminator)
    #endif
}



기존의 Print의 경우 위와같이 Print 문은 다른정보 없이 표기가 되는데, 이번에 재정의하여 사용하려고 하는 목적은 [시간] <클래스명:(라인) 함수명> : 내용 으로 출력할 수 있게 표시하였습니다.


  궁금증

NSLog 처럼 같은 이름으로 사용할 순 없을까?
가능하다. 그러나 필자와 같이 표기하는 항목중 #file, #line, #function의 경우 별도로 넣은 파라메터이기 때문에 기본 Print("내용") 으로 썼을때 인식이 Swift 기본 Print 문으로 인식하게된다.
결론적으로는 위와 같이 Print 함수명을 조금 수정하여 사용하게 되었다.

끝.


  참고

리터널표현 : https://docs.swift.org/swift-book/ReferenceManual/Expressions.html
Print문 재정의 : https://medium.com/@marksiu/day-of-swift-how-to-print-class-name-function-name-and-line-number-f14fd11d87d8


댓글