[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
위 그림과 같이 [시간] [프로젝트명] <클래스명:(라인)> 내용 으로 출력이 가능합니다.
/// 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.htmlPrint문 재정의 : https://medium.com/@marksiu/day-of-swift-how-to-print-class-name-function-name-and-line-number-f14fd11d87d8
댓글
댓글 쓰기