스위프트 : print () vs println () vs NSLog ()


450

무슨 사이의 차이점 print, NSLog그리고 println때 나는 각 사용해야합니까?

예를 들어, 파이썬에서 사전을 인쇄하고 싶다면 그냥 print myDict이지만 지금은 다른 두 가지 옵션이 있습니다. 언제 어떻게 사용해야합니까?



2
NSLog의 경우와 NSDictionary를 인쇄해도 유용한 점이 없습니까?
사용자

iOS 10.0부터는을 사용하는 것이 좋습니다 os_log. 아래 내 답변을 참조하십시오 .
HuaTham

Swift 문서를 참조하십시오 os_log: objective-C 페이지 의 전체 문서 를 보십시오 . 훨씬 더 완벽 합니다.
Honey

답변:


758

몇 가지 차이점 :

  1. printvs println:

    print함수는 앱을 디버깅 할 때 Xcode 콘솔에 메시지를 인쇄합니다.

    println스위프트 (2)에서 제거하고, 더 이상 사용되지 않는 이러한 변형이다. 사용중인 이전 코드가 표시되면 println이제로 바꿀 수 있습니다 print.

    Swift 1.x로 돌아가서 print인쇄 된 문자열의 끝에 줄 바꿈 문자를 추가하지 않았지만 그렇지 println않았습니다. 그러나 요즘에는 print항상 문자열 끝에 줄 바꿈 문자를 추가하고 원하지 않는 경우 terminator매개 변수를 제공하십시오 "".

  2. NSLog:

    • NSLog 느리다;

    • NSLog타임 스탬프와 식별자를 출력에 추가하지만 print그렇지는 않습니다.

    • NSLog명령문은 장치 콘솔과 디버거 콘솔 모두에 표시되는 반면 print디버거 콘솔에만 나타납니다.

    • NSLogprintf스타일 형식 문자열을 사용 합니다. 예 :

      NSLog("%0.4f", CGFloat.pi)

      그것은 생산할 것이다 :

      2017-06-09 11 : 57 : 55.642328-0700 MyApp [28937 : 1751492] 3.1416

  3. 효과적인 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 장치 설명 을 계속 볼 수 있습니다.


37
좋은 요약! 몇 가지를 더 추가하려면 : NSString을 제외하고 NSString을 println으로 전달할 수 있습니다. NSLog에는 인수를 추가 할 수 있지만 println에는 추가 할 수 없습니다. NSLog에 대해 스위프트 스타일 문자열 보간이 때때로 충돌하지만 println은 충돌하지 않습니다.
Bao Lei

2
Swift 컴파일러 최적화 및 print () medium.com/ios-os-x-development/
Carl

@Rob 내가 print를 사용하면 디버거 콘솔에 표시됩니까? 아니면 debugPrint를 사용해야합니까?

1
를 사용하면 printXcode의 디버그 영역에와 같이 나타납니다 debugPrint. 유일한 차이는 즉 print전화 끝 description객체 및 방법 debugPrint호출 debugDescription더 자세한보다있다 description.
Rob

@Honey,이 주석 스레드가 너무 길다고 플래그가 지정되었으므로 주석이 확장 토론이나 디버깅 세션을위한 것이 아니라는 것을 상기하고 싶습니다 . 당신은 스택 오버플로 형식에 적합한 질문으로 질문 할 수있는 일이 있다면, 제발 그 사람이 대답 혜택을 누릴 수 있도록 질문으로 부탁드립니다. 문제가되지 않으면 대화를 통해 대화를 나눠야합니다. 설명을 요구하거나 빠른 관찰을하기 위해서만 의견을 남겨 두십시오.
코디 그레이

80

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:".")

5
appendNewline기본값은true
Adam

1
iOS (9.0)에서는 다음을 사용해야합니다 terminator : "". 예 :print("...", terminator: "")
Khotu Nam

첫 문장의 문장이 잘못되었습니다. NSLog ()는 최신 Swift 2.x에서도 작동합니다.
Sebastian

62

또한 Swift 2에는 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프로토콜을 통해 디버그 문자열 표현을 사용자 정의 할 수 있습니다 .


2
DebugPrintableprotocol의 이름이 CustomDebugStringConvertibleprotocol 로 변경되었습니다 .
Franklin Yu

프랭클린 감사합니다!
Valentin Shergin

의 그래서 스위프트 description이다 debugDescription파이썬의대로 str이다 repr?
BallpointBen

예, 그렇게 생각합니다.
Valentin Shergin

39

Rob의 답변에 추가하기 위해, iOS 10.0부터 Apple은 기존 로깅 시스템 (ASL 및 Syslog, NSLog 포함)을 대체하는 완전히 새로운 "통합 로깅"시스템을 도입했으며 기존의 로깅 방식을 능가하는 새로운 기술을 통해 로그 데이터 압축 및 지연된 데이터 수집

에서 애플 :

통합 로깅 시스템은 모든 수준의 시스템에서 메시징을 캡처 할 수있는 효율적인 단일 고성능 API를 제공합니다. 이 통합 시스템은 로그 데이터 저장을 메모리와 디스크의 데이터 저장소에 집중시킵니다.

Apple os_log은 이전 로깅 시스템에 비해 성능이 크게 향상되어 정보, 디버그, 오류 메시지를 포함한 모든 종류의 메시지를 기록하고 개발자가 편리한 로그 및 활동 검사를 수행 할 수있는 중앙 집중식 데이터 수집을 사용하는 것이 좋습니다. 실제로 새 시스템은 설치 공간이 너무 적기 때문에 로깅 명령을 삽입하여 버그가 발생하는 것을 방해하여 버그가 사라지는 "관찰자 효과"를 유발하지 않을 수 있습니다.

새로운 통합 로깅 시스템의 일부인 활동 추적 성능

이에 대한 자세한 내용은 여기 를 참조 하십시오 .

요약하면 : print()편의를 위해 개인 디버깅에 사용 하십시오 (그러나 사용자 장치에 배포 될 때 메시지는 기록되지 않습니다). 그런 다음 os_log다른 모든 것에는 가능한 한 많이 통합 로깅 ( )을 사용하십시오 .


5

dump()로깅에도 사용할 수있는 또 다른 방법 이 있습니다.

func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)

미러를 사용하여 객체의 내용을 표준 출력으로 덤프합니다.

에서 스위프트 표준 라이브러리 함수

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.