print
, NSLog
및 println
의 차이점은 무엇이며 언제 각각 사용해야합니까?
예를 들어, Python에서 사전을 인쇄하고 싶다면 print myDict
를 사용했지만 이제는 다른 두 가지 옵션이 있습니다. 언제 어떻게해야합니까?
몇 가지 차이점 :
print
대 println
:
print
함수는 응용 프로그램을 디버깅 할 때 Xcode 콘솔에 메시지를 인쇄합니다.
println
은 Swift 2에서 제거되어 더 이상 사용되지 않는 변형입니다. println
을 사용하는 오래된 코드가 표시되면 안전하게 print
으로 바꿀 수 있습니다.
Swift 1.x에서 print
은 인쇄 된 문자열의 끝에 개행 문자를 추가하지 않았고 println
은 수정하지 않았습니다. 그러나 요즘 print
은 항상 문자열의 끝에 개행 문자를 추가합니다. 그렇게하지 않으려면 ""
의 terminator
매개 변수를 제공하십시오.
NSLog
:
NSLog
은 느립니다.
NSLog
은 타임 스탬프와 식별자를 출력에 추가하지만 print
은 출력에 추가하지 않습니다.
NSLog
문은 장치의 콘솔과 디버거 콘솔에 표시되는 반면 print
은 디버거 콘솔에만 나타납니다.
NSLog
은 printf
- 스타일 형식 문자열을 사용합니다.
NSLog("%0.4f", CGFloat.pi)
그 결과는 다음과 같다.
2017-06-09 11 : 57 : 55.642328-0700 MyApp [28937 : 1751492] 3.1416
효과적인 iOS 10/macOS 10.12에는 "통합 로깅"시스템의 일부인 os_log
(WWDC 2016 비디오 통합 로깅 및 활동 추적 참조)가 있습니다.
os.log
함수를 사용하려면 먼저 os_log
를 가져와야합니다.
import os.log
NSLog
과 마찬가지로 os_log
도 Xcode 디버깅 콘솔과 장치 콘솔 모두에 메시지를 출력합니다
이제 콘솔 앱에서 사용할 수있는 "하위 시스템"및 "카테고리"필드를 제어 할 수 있습니다. 예 :
let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network")
os_log("url = %@", log: log, url.absoluteString)
외부 콘솔 앱을 통해 앱을 볼 때 기본보기에이 열을 추가 할 수있을뿐만 아니라 이러한 열을 기준으로 필터링 할 수 있습니다. 디버깅 메시지를 (a) 앱을 대신하여 다른 하위 시스템에서 생성 된 메시지와 차별화하려는 경우 매우 유용합니다. 또는 (b) 다른 카테고리 또는 유형의 메시지.
.info
, .debug
, .error
, .fault
(또는 .default
)와 같은 여러 유형의 로깅 메시지를 지정할 수 있습니다.
os_log("web service did not respond", type: .error)
따라서 외부 콘솔 앱을 사용하는 경우 특정 카테고리의 메시지 만 보도록 선택할 수 있습니다 (예 : 콘솔 '작업'메뉴의 '디버그 메시지 포함'을 선택하면 디버깅 메시지 만 표시). 이러한 설정은 사물이 디스크에 기록되는지 여부에 대한 많은 미묘한 문제에 대한 세부 사항을 지시합니다. 자세한 내용은 WWDC 비디오를 참조하십시오.
os_log
를 사용할 때는 문자열 보간을 사용할 수 없습니다. 예를 들면 다음과 같이 할 수 없습니다.
os_log("foo \(url.absoluteString)")
당신은해야 할 것입니다 :
os_log("url = %@", url.absoluteString)
위의 제한 사항 중 하나는 데이터 개인 정보를 지원하는 것입니다. 기본 데이터 유형 (예 : 숫자)은 기본적으로 공개되며 객체 (예 : 문자열)는 기본적으로 비공개입니다. 이전에 URL을 기록한 예에서 앱이 기기 자체에서 호출되었고 Mac의 Console 앱에서 시청 한 경우 다음과 같이 표시됩니다.
url = <개인>
외부 장치에서보고 싶다면 다음을 수행해야합니다.
os_log("url = %{public}@", url.absoluteString)
참고 NSLog
은 통합 통보 시스템을 배경으로 사용하지만 다음과 같은주의 사항이 있습니다.
하위 시스템이나 범주 또는 로그 유형을 제어 할 수 없습니다.
개인 정보 설정을 지원하지 않습니다.
결론은 간단한 작업에는 print
이면 충분하지만 NSLog
에는 타임 스탬프 정보가 포함되어있어 유용합니다.
Xcode 외부에서 테스트해야하는 iOS 앱을 디버깅 할 때 os_log
의 기능이 크게 개선되었습니다. 예를 들어 배경 iOS 앱을 테스트 할 때 배경 가져 오기와 같은 프로세스가 Xcode 디버거 앱 라이프 사이클을 변경 에 연결됩니다. 따라서 Xcode의 디버거에서 앱을 시작하지 않고 기기 자체에서 앱을 실행하여 실제 기기에서 테스트하고 싶은 경우가 자주 있습니다. 통합 로깅은 macOS 콘솔 앱에서 iOS 기기의 os_log
구문을 계속 보도록하겠습니다.
Swift 2를 사용하는 경우 print () 만 사용하여 출력물에 내용을 쓸 수 있습니다.
Apple은 println ()과 print () 함수를 하나로 결합했습니다.
iOS 9로 업데이트되었습니다.
기본적으로이 함수는 줄 바꿈을 추가하여 인쇄 한 줄을 종료합니다.
print("Hello Swift")
터미네이터
줄 바꿈없이 값을 인쇄하려면 빈 문자열을 종결 자로 전달하십시오
print("Hello Swift", terminator: "")
구분 기호
구분 기호를 사용하여 여러 항목을 연결할 수 있습니다.
print("Hello", "Swift", 2, separator:" ")
둘 다
또는이 방법으로 결합하여 사용할 수 있습니다.
print("Hello", "Swift", 2, separator:" ", terminator:".")
debugPrint()
그리고 CustomDebugStringConvertible
프로토콜)을 가지고 있습니다!debugPrint()
처럼 작동하는 print()
은 잊지 마라. 는 _ (debugging )에 가장 적합하다.
예 :
print("Hello World!")
은 Hello World
가됩니다.debugPrint("Hello World!")
은 "Hello World"
인용구!)가됩니다.print(1..<6)
은 1..<6
가됩니다.debugPrint(1..<6)
은 Range(1..<6)
이됩니다.모든 클래스는 CustomDebugStringConvertible
protocol)을 통해 디버그 문자열 표현을 사용자 정의 할 수 있습니다.
Apple은 iOS 10.0부터 기존의 로깅 시스템 (ASL 및 Syslog, NSLog 포함)을 대체하는 새로운 "통합 로깅"시스템을 도입했으며 Robot의 새로운 기술 덕분에 기존의 로깅 접근법을 능가합니다. 로그 데이터 압축 및 지연된 데이터 수집.
~ Apple :
통합 로깅 시스템은 모든 수준의 시스템에서 메시징을 캡처 할 수있는 효율적이고 효율적인 단일 API를 제공합니다. 이 통합 시스템은 메모리와 디스크의 데이터 저장소에 로그 데이터의 저장을 중앙 집중화합니다.
Apple은 정보, 디버그, 이전 로깅 시스템에 비해 훨씬 향상된 성능으로 인한 오류 메시지 및 개발자를위한 편리한 로그 및 활동 검사를 허용하는 중앙 집중식 데이터 수집을 포함하여 모든 종류의 메시지를 기록하기 위해 앞으로 os_log
를 사용할 것을 적극 권장합니다. 사실, 새로운 시스템은 로깅 명령을 삽입하면 버그가 사라지는 "관찰자 효과"가 발생하지 않으므로 버그가 발생할 가능성이 적습니다.
자세한 내용은 여기 에서 자세히 알아볼 수 있습니다.
요약하면 편의상 개인 디버깅을 위해 print()
을 사용합니다 (그러나 사용자 장치에 배포 할 때 메시지는 기록되지 않습니다). 그런 다음 다른 모든 작업에 가능한 한 Unified Logging (os_log
)을 사용하십시오.
로깅을 위해 사용될 수있는 dump()
이라는 다른 방법이 있습니다.
func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)
미러를 사용하여 객체의 내용을 표준 출력으로 덤프합니다.