Swift: print () vs println () vs NSLog ()


450

Ne arasındaki fark var print, NSLogve printlnve ne zaman her kullanmalıyım?

Örneğin, bir sözlük yazdırmak istersem Python'da, sadece print myDict, ama şimdi 2 seçeneğim daha var. Her birini nasıl ve ne zaman kullanmalıyım?



2
NSLog ve bir NSDictionary yazdırmak bana yararlı bir şey vermiyor?
Kullanıcı

İOS 10.0'dan itibaren birinin kullanılması önerilir os_log. Lütfen cevabımı aşağıya bakın .
HuaTham

Swift belgelerini aşağıda görmeye ek olarak os_log: objektif-C sayfasının tüm belgelerini görmeyi deneyin . Çok daha eksiksiz .
Bal

Yanıtlar:


758

Birkaç fark:

  1. printvs println:

    printXcode konsolunda fonksiyon baskılar mesajları uygulamaları ayıklarken.

    printlnSwift 2 çıkarıldı ve artık kullanılmayan bu bir çeşididir. Kullanmakta olan eski kodu printlngörürseniz, şimdi güvenle değiştirebilirsiniz print.

    Swift 1.x'te, printyazdırılan dizenin sonuna yeni satır karakterleri eklemedi, oysa println. Ancak günümüzde, printher zaman dizenin sonuna satırsonu karakterini ekler ve eğer bunu yapmak istemiyorsanız, bir terminatorparametre sağlayın "".

  2. NSLog:

    • NSLog daha yavaştır;

    • NSLogçıktıya bir zaman damgası ve tanımlayıcı ekler print;

    • NSLogifadeleri hem cihazın konsolunda hem de hata ayıklayıcı konsolunda, printyalnızca hata ayıklayıcı konsolunda görünür.

    • NSLogprintf-style biçim dizeleri kullanır , ör.

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

      üretecek:

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

  3. Etkili iOS 10 / macOS 10.12, os_log"birleşik günlük" sisteminin bir parçası olan üçüncü bir alternatif var (bkz. WWDC 2016 video Birleşik Günlük ve Etkinlik İzleme ).

    • İşlevi os.logkullanmadan önce içe aktarmanız gerekir os_log:

      import os.log
    • Gibi NSLog, os_logXcode ayıklama konsolu ve cihaz konsola ilişkin irade çıktı mesajları da

    • Artık Konsol uygulamasında bulunan "alt sistem" ve "kategori" alanlarını kontrol edebilirsiniz. Örneğin:

      let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network")
      os_log("url = %@", log: log, url.absoluteString)

      Uygulamayı harici Konsol uygulaması aracılığıyla gözlemlediğinizde, bu sütunları yalnızca ana görünüme eklemekle kalmaz, aynı zamanda bunlara göre filtreleyebilirsiniz. Hata ayıklama mesajlarınızı (a) uygulamanız adına diğer alt sistemler tarafından oluşturulan mesajlardan ayırt etmek istediğinizde çok kullanışlıdır; veya (b) diğer kategorilerden veya türlerden mesajlar.

    • Sen mesajları giriş farklı türlerini belirtir, ya edebilir .info, .debug, .error, .fault(veya .default):

      os_log("web service did not respond", type: .error)

      Bu nedenle, harici Konsol uygulamasını kullanıyorsanız, yalnızca belirli kategorilerin mesajlarını görmeyi seçebilirsiniz (örneğin, hata ayıklama mesajlarını yalnızca Konsol "Eylem" menüsünde "Hata Ayıklama Mesajlarını Ekle" seçeneğini belirlerseniz gösterebilirsiniz). Bu ayarlar ayrıca, şeylerin diske kaydedilip kaydedilmeyeceği ile ilgili pek çok ince sorun ayrıntısı da belirler. Daha fazla ayrıntı için WWDC videosuna bakın.

    • Kullanırken dize enterpolasyonunu kullanamazsınız os_log. Örneğin şunları yapamazsınız:

      os_log("foo \(url.absoluteString)")

      Yapmanız gerekenler:

      os_log("url = %@", url.absoluteString)
    • Yukarıdaki sınırlamanın nedenlerinden biri veri gizliliğini desteklemektir. İlkel veri türleri (örn. Sayılar) varsayılan olarak herkese açıktır ve nesneler (örn. Dizeler) varsayılan olarak özeldir. URL'yi kaydettiğiniz önceki örnekte, uygulama cihazın kendisinden çağrılmışsa ve Mac'inizin Konsol uygulamasından izliyorsanız, şunu görürdünüz:

      url = <gizli>

      Harici cihazdan görmek istiyorsanız şunları yapmanız gerekir:

      os_log("url = %{public}@", url.absoluteString)
    • Not, NSLogşimdi perde arkasında, ancak aşağıdaki uyarılarla birleştirilmiş bildirim sistemini kullanıyor:

      • Alt sistemi, kategoriyi veya günlük türünü denetleyemezsiniz;

      • Gizlilik ayarlarını desteklemez.

Alt satır, printbasit görevler için yeterlidir, ancak NSLogsizin için zaman damgası bilgileri içerdiğinden faydalıdır.

Gücü os_logXcode dışında test edilecek olan iOS uygulamaları ayıklarken buna kesin girer. Örneğin, arka plan getirme gibi arka plan iOS uygulama işlemlerini test ederken, Xcode hata ayıklayıcısına bağlı olmak uygulama yaşam döngüsünü değiştirir . Bu nedenle, sık sık uygulamayı Xcode'un hata ayıklayıcısından başlatmamak, uygulamayı cihazın kendisinden çalıştırarak fiziksel cihazda test etmek istersiniz. Birleşik günlük kaydı, iOS cihazınızın os_logdeyimlerini macOS Console uygulamasından izlemenize izin verir .


37
Güzel özet! Birkaç tane daha eklemek için: bir NSString'i println'ye iletebilirsiniz, ancak NSLog'u geçemezsiniz; NSLog için bağımsız değişkenler ekleyebilirsiniz, ancak println değil; Swift tarzı dize enterpolasyonu bazen NSLog için çöküyor, ancak println için çökmüyor.
Bao Lei

2
derleyici optimizasyonu ve baskı kullanımı hakkında ilginç bir not () medium.com/ios-os-x-development/…
Carl

@ Print kullanıyorsam hata ayıklayıcı konsolunda görünüyor mu görünmüyor mu yoksa debugPrint kullanmalı mıyız?

1
Eğer kullanırsanız print, bu Xcode hata ayıklama alanında gösterir, tıpkı debugPrint. Tek fark, nesnenin printarama descriptionyöntemini ve daha ayrıntılı olabilen debugPrintçağrıları sonlandırmasıdır . debugDescriptiondescription
Rob

@Honey, bu yorum dizisi aşırı uzun olarak işaretlendi, bu yüzden size yorumların genişletilmiş tartışma veya hata ayıklama oturumları için olmadığını hatırlatmak istedim . Yığın Taşması biçimine uygun bir soru olarak sorulabilecek bir şeyiniz varsa, lütfen herkesin yanıtlarından yararlanabilmesi için bir soru olarak sorun. Bir soru olarak işe yaramazsa, sohbet etmek için tartışmaya girmeniz gerekir. Yorumları yalnızca açıklama istemek veya hızlı gözlem yapmak için ayırın.
Cody Gray

80

Swift 2 kullanıyorsanız , artık çıktıya bir şeyler yazmak için sadece print () kullanabilirsiniz.

Elma hem birleştirdi println () ve print () birine fonksiyonları.

İOS 9'a güncellendi

Varsayılan olarak, işlev satır sonu ekleyerek yazdırdığı satırı sonlandırır.

print("Hello Swift")

terminatör

Satır sonu olmadan bir değeri yazdırmak için sonlandırıcı olarak boş bir dize geçirin

print("Hello Swift", terminator: "")

Ayırıcı

Artık birden çok öğeyi birleştirmek için ayırıcı kullanabilirsiniz

print("Hello", "Swift", 2, separator:" ")

Her ikisi de

Veya bu şekilde kullanarak birleştirebilirsiniz

print("Hello", "Swift", 2, separator:" ", terminator:".")

5
appendNewlinevarsayılan değeri vardırtrue
Adam

1
terminator : ""print("...", terminator: "")
İOS'ta

İlk cümlenizdeki ifade yanlış. NSLog () hala en son Swift 2.x'te bile çalışıyor
Sebastian

62

Dahası, Swift 2 debugPrint()(ve CustomDebugStringConvertibleprotokol) var!

Unutmayın debugPrint()gibi çalışır hangi print()fakat en uygun ayıklama .

Örnekler:

  • Teller
    • print("Hello World!") olur Hello World
    • debugPrint("Hello World!")olur "Hello World"(Alıntılar!)
  • aralıklar
    • print(1..<6) olur 1..<6
    • debugPrint(1..<6) olur Range(1..<6)

Herhangi bir sınıf, hata ayıklama dizesi temsilini CustomDebugStringConvertibleprotokol aracılığıyla özelleştirebilir .


2
DebugPrintableprotokol olarak yeniden adlandırıldı CustomDebugStringConvertibleprotokolü .
Franklin Yu

Teşekkürler Franklin!
Valentin Shergin

En Yani Swift descriptionetmektir debugDescriptionPython adlı kadar stretmektir repr?
BallpointBen

Evet bencede.
Valentin Shergin

39

Rob'un cevabına eklemek için, iOS 10.0'dan bu yana Apple, mevcut günlükleme sistemlerinin (ASL ve Syslog, NSLog dahil) yerini alan ve aynı zamanda yeni teknikler sayesinde performanstaki mevcut günlükleme yaklaşımlarını aşan tamamen yeni bir "Birleştirilmiş Kayıt" sistemini tanıttı. log veri sıkıştırma ve ertelenmiş veri toplama.

Gönderen Apple :

Birleştirilmiş günlük sistemi, sistemin tüm düzeylerinde mesajlaşmayı yakalamak için tek, etkili, performanslı bir API sağlar. Bu birleşik sistem, günlük verilerinin bellekte ve diskteki bir veri deposunda depolanmasını merkezileştirir.

Apple os_log, önceki günlük sistemlerine kıyasla çok daha iyi performans göstermesi nedeniyle bilgi, hata ayıklama, hata iletileri de dahil olmak üzere her türlü iletinin günlüğe kaydedilmesini ve geliştiriciler için uygun günlük ve etkinlik denetimine olanak tanıyan merkezi veri toplanmasını öneriyor . Aslında, yeni sistem büyük olasılıkla o kadar az yer kaplar ki, bir günlüğe kaydetme komutu eklerseniz hatanızın zamanlamasını engellemek için hatanızın kaybolduğu "gözlemci etkisi" ne neden olmaz.

Artık yeni Birleşik Kayıt sisteminin bir parçası olan Etkinlik İzleme Performansı

Bununla ilgili daha fazla bilgiyi burada ayrıntılı olarak bulabilirsiniz .

Özetlemek gerekirse: print()kolaylık sağlamak için kişisel hata ayıklamanız için kullanın (ancak kullanıcı cihazlarına dağıtıldığında mesaj kaydedilmez). Ardından, os_logher şey için olabildiğince Birleşik Kayıt ( ) kullanın .


5

dump()Günlüğe kaydetmek için de kullanılabilecek denilen başka bir yöntem var :

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

Bir nesnenin içeriğini kullanarak aynasını standart çıktıya atar.

Gönderen Swift Standart Kütüphane İşlevleri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.