무슨 사이의 차이점 print
, NSLog
그리고 println
때 나는 각 사용해야합니까?
예를 들어, 파이썬에서 사전을 인쇄하고 싶다면 그냥 print myDict
이지만 지금은 다른 두 가지 옵션이 있습니다. 언제 어떻게 사용해야합니까?
무슨 사이의 차이점 print
, NSLog
그리고 println
때 나는 각 사용해야합니까?
예를 들어, 파이썬에서 사전을 인쇄하고 싶다면 그냥 print myDict
이지만 지금은 다른 두 가지 옵션이 있습니다. 언제 어떻게 사용해야합니까?
답변:
몇 가지 차이점 :
print
vs println
:
이 print
함수는 앱을 디버깅 할 때 Xcode 콘솔에 메시지를 인쇄합니다.
는 println
스위프트 (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
엑스 코드 디버깅 콘솔 장치 본체 모두가 출력 메시지가 너무
이제 콘솔 앱에서 사용 가능한 "서브 시스템"및 "카테고리"필드를 제어 할 수 있습니다. 예를 들면 다음과 같습니다.
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의 콘솔 앱에서보고있는 경우 다음과 같이 표시됩니다.
url = <비공개>
외부 장치에서보고 싶다면 다음을 수행해야합니다.
os_log("url = %{public}@", url.absoluteString)
참고 NSLog
이제하지만 다음과 같은주의 사항과 함께, 뒤에서 통합 통지 시스템을 사용합니다 :
서브 시스템, 카테고리 또는 로그 유형을 제어 할 수 없습니다.
개인 정보 설정을 지원하지 않습니다.
결론 print
은 간단한 작업에는 충분하지만 NSLog
타임 스탬프 정보가 포함되어 있기 때문에 유용합니다.
의 힘은 os_log
엑스 코드의 외부를 검사 할 필요가 아이폰 OS 응용 프로그램을 디버깅 할 때 강한 구조로되어 있습니다. 예를 들어 백그라운드 가져 오기와 같은 백그라운드 iOS 앱 프로세스를 테스트 할 때 Xcode 디버거에 연결 되면 앱 수명주기가 변경 됩니다. 따라서 Xcode의 디버거에서 응용 프로그램을 시작하지 않고 장치 자체에서 응용 프로그램을 실행하면서 실제 장치에서 테스트하려는 경우가 종종 있습니다. 통합 로깅 os_log
을 사용하면 macOS 콘솔 앱에서 iOS 장치 설명 을 계속 볼 수 있습니다.
print
Xcode의 디버그 영역에와 같이 나타납니다 debugPrint
. 유일한 차이는 즉 print
전화 끝 description
객체 및 방법 debugPrint
호출 debugDescription
더 자세한보다있다 description
.
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:".")
appendNewline
기본값은true
terminator : ""
. 예 :print("...", terminator: "")
debugPrint()
(및 CustomDebugStringConvertible
프로토콜)이 있습니다!debugPrint()
어느 것이 작동 print()
하지만 디버깅에 가장 적합한 지 잊지 마십시오 .
예 :
print("Hello World!")
된다 Hello World
debugPrint("Hello World!")
가된다 "Hello World"
(따옴표를!)print(1..<6)
된다 1..<6
debugPrint(1..<6)
된다 Range(1..<6)
모든 클래스는 CustomDebugStringConvertible
프로토콜을 통해 디버그 문자열 표현을 사용자 정의 할 수 있습니다 .
DebugPrintable
protocol의 이름이 CustomDebugStringConvertible
protocol 로 변경되었습니다 .
description
이다 debugDescription
파이썬의대로 str
이다 repr
?
Rob의 답변에 추가하기 위해, iOS 10.0부터 Apple은 기존 로깅 시스템 (ASL 및 Syslog, NSLog 포함)을 대체하는 완전히 새로운 "통합 로깅"시스템을 도입했으며 기존의 로깅 방식을 능가하는 새로운 기술을 통해 로그 데이터 압축 및 지연된 데이터 수집
에서 애플 :
통합 로깅 시스템은 모든 수준의 시스템에서 메시징을 캡처 할 수있는 효율적인 단일 고성능 API를 제공합니다. 이 통합 시스템은 로그 데이터 저장을 메모리와 디스크의 데이터 저장소에 집중시킵니다.
Apple os_log
은 이전 로깅 시스템에 비해 성능이 크게 향상되어 정보, 디버그, 오류 메시지를 포함한 모든 종류의 메시지를 기록하고 개발자가 편리한 로그 및 활동 검사를 수행 할 수있는 중앙 집중식 데이터 수집을 사용하는 것이 좋습니다. 실제로 새 시스템은 설치 공간이 너무 적기 때문에 로깅 명령을 삽입하여 버그가 발생하는 것을 방해하여 버그가 사라지는 "관찰자 효과"를 유발하지 않을 수 있습니다.
요약하면 : print()
편의를 위해 개인 디버깅에 사용 하십시오 (그러나 사용자 장치에 배포 될 때 메시지는 기록되지 않습니다). 그런 다음 os_log
다른 모든 것에는 가능한 한 많이 통합 로깅 ( )을 사용하십시오 .
dump()
로깅에도 사용할 수있는 또 다른 방법 이 있습니다.
func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)
미러를 사용하여 객체의 내용을 표준 출력으로 덤프합니다.