kutombawewe.net

스위프트 : print () 대 println ()과 NSLog ()

print, NSLogprintln의 차이점은 무엇이며 언제 각각 사용해야합니까?

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

391
User

몇 가지 차이점 :

  1. printprintln :

    print 함수는 응용 프로그램을 디버깅 할 때 Xcode 콘솔에 메시지를 인쇄합니다.

    println은 Swift 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도 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 구문을 계속 보도록하겠습니다.

656
Rob

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

게다가, Swift 2는 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)이됩니다.

모든 클래스는 CustomDebugStringConvertibleprotocol)을 통해 디버그 문자열 표현을 사용자 정의 할 수 있습니다.

60
Valentin Shergin

Apple은 iOS 10.0부터 기존의 로깅 시스템 (ASL 및 Syslog, NSLog 포함)을 대체하는 새로운 "통합 로깅"시스템을 도입했으며 Robot의 새로운 기술 덕분에 기존의 로깅 접근법을 능가합니다. 로그 데이터 압축 및 지연된 데이터 수집.

~ Apple :

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

Apple은 정보, 디버그, 이전 로깅 시스템에 비해 훨씬 향상된 성능으로 인한 오류 메시지 및 개발자를위한 편리한 로그 및 활동 검사를 허용하는 중앙 집중식 데이터 수집을 포함하여 모든 종류의 메시지를 기록하기 위해 앞으로 os_log를 사용할 것을 적극 권장합니다. 사실, 새로운 시스템은 로깅 명령을 삽입하면 버그가 사라지는 "관찰자 효과"가 발생하지 않으므로 버그가 발생할 가능성이 적습니다.

 Performance of Activity Tracing, now part of the new Unified Logging system

자세한 내용은 여기 에서 자세히 알아볼 수 있습니다.

요약하면 편의상 개인 디버깅을 위해 print()을 사용합니다 (그러나 사용자 장치에 배포 할 때 메시지는 기록되지 않습니다). 그런 다음 다른 모든 작업에 가능한 한 Unified Logging (os_log)을 사용하십시오.

30
HuaTham

로깅을 위해 사용될 수있는 dump()이라는 다른 방법이 있습니다.

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

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

Swift 표준 라이브러리 함수

3
JAL