स्विफ्ट: प्रिंट () बनाम प्रिंट्लन () बनाम NSLog ()


450

क्या अंतर है print, NSLogऔर printlnमुझे प्रत्येक का उपयोग कब करना चाहिए?

उदाहरण के लिए, पायथन में अगर मैं एक डिक्शनरी छापना चाहता हूं, तो मैं अभी बता सकता हूं print myDict, लेकिन अब मेरे पास 2 अन्य विकल्प हैं। मुझे कैसे और कब प्रत्येक का उपयोग करना चाहिए?



2
NSLog के बारे में क्या कहना है और मुझे कोई उपयोगी नहीं है?
उपयोगकर्ता

IOS 10.0 फॉरवर्ड से यह अनुशंसा की जाती है कि एक उपयोग करता है os_log। कृपया मेरा जवाब नीचे देखें
हुआहम

स्विफ्ट प्रलेखन को देखने के अलावा os_log: उद्देश्य-सी पृष्ठ के पूर्ण प्रलेखन को देखने का प्रयास करें । यह बहुत अधिक पूर्ण है
Honey

जवाबों:


758

कुछ अंतर:

  1. printबनाम println:

    printXcode कंसोल में समारोह प्रिंट संदेशों जब क्षुधा डीबगिंग।

    इस printlnका एक रूपांतर है जो स्विफ्ट 2 में हटा दिया गया था और इसका उपयोग नहीं किया जाता है। यदि आपको पुराना कोड दिखाई दे रहा है println, तो अब आप इसे सुरक्षित रूप से बदल सकते हैं print

    स्विफ्ट 1.x में वापस, printमुद्रित स्ट्रिंग के अंत में न्यूलाइन वर्ण नहीं जोड़े, जबकि printlnकिया था। लेकिन आजकल, printहमेशा स्ट्रिंग के अंत में न्यूलाइन वर्ण जोड़ता है, और यदि आप ऐसा नहीं करना चाहते हैं, तो एक terminatorपैरामीटर की आपूर्ति करें ""

  2. 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

  3. प्रभावी iOS 10 / macOS 10.12, एक तीसरा विकल्प है, os_log"एकीकृत लॉगिंग" प्रणाली का हिस्सा (देखें WWDC 2016 वीडियो यूनिफाइड लॉगिंग और एक्टिविटी ट्रेसिंग )।

    • फ़ंक्शन os.logका उपयोग करने से पहले आपको आयात करना होगा os_log:

      import os.log
    • जैसे NSLog, os_logXcode डिबगिंग कंसोल और डिवाइस कंसोल, दोनों को भी संदेश आउटपुट करेगा

    • अब आप कंसोल एप्लिकेशन में उपलब्ध "सबसिस्टम" और "श्रेणी" फ़ील्ड को नियंत्रित कर सकते हैं। उदाहरण के लिए:

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

      जब आप बाहरी कंसोल ऐप के माध्यम से ऐप का निरीक्षण करते हैं, तो आप न केवल इन कॉलमों को मुख्य दृश्य में जोड़ सकते हैं, बल्कि आप इन के आधार पर फ़िल्टर कर सकते हैं। यह बहुत उपयोगी है जब आप अपने एप्लिकेशन की ओर से अन्य उप-प्रणालियों द्वारा उत्पन्न (ए) से अपने डिबगिंग संदेशों को अलग करना चाहते हैं; या (बी) अन्य श्रेणियों या प्रकार के संदेश।

    • आप संदेश लॉग इन करने के विभिन्न प्रकार निर्दिष्ट कर सकते हैं, या तो .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 को लॉग इन किया था, अगर ऐप को डिवाइस से ही मंगवाया गया था और आप अपने मैक के कंसोल ऐप से देख रहे थे, तो आप देखेंगे:

      url = <निजी>

      यदि आप इसे बाहरी डिवाइस से देखना चाहते हैं, तो आपको करना होगा:

      os_log("url = %{public}@", url.absoluteString)
    • ध्यान दें, NSLogअब पर्दे के पीछे एकीकृत अधिसूचना प्रणाली का उपयोग करता है, लेकिन निम्नलिखित चेतावनी के साथ:

      • आप सबसिस्टम या श्रेणी या लॉग प्रकार को नियंत्रित नहीं कर सकते;

      • यह गोपनीयता सेटिंग्स का समर्थन नहीं करता है।

निचला रेखा, printसरल कार्यों के लिए पर्याप्त है, लेकिन NSLogउपयोगी है क्योंकि इसमें आपके लिए टाइमस्टैम्प जानकारी शामिल है।

os_logXcode के बाहर परीक्षण किए जाने वाले iOS ऐप को डीबग करते समय स्टार्क राहत की शक्ति में आता है। उदाहरण के लिए, बैकग्राउंड आईओएस ऐप की टेस्टिंग करते समय, बैकग्राउंड लाने की तरह, Xcode डिबगर से कनेक्ट होने से ऐप लाइफसाइकल बदल जाता है । तो, आप बार-बार भौतिक डिवाइस पर परीक्षण करना चाहते हैं, डिवाइस से ही ऐप चला रहे हैं, एक्सकोड के डिबगर से ऐप शुरू नहीं कर रहे हैं। एकीकृत लॉगिंग आप अभी भी os_logmacOS कंसोल ऐप से अपने iOS डिवाइस स्टेटमेंट देखते हैं ।


37
अच्छा सारांश! कुछ और जोड़ने के लिए: आप एक एनएसएसटीरिंग में प्रिंटलाइन पर पास कर सकते हैं, लेकिन एनएसएलॉग नहीं; आप NSLog के लिए आर्गन जोड़ सकते हैं, लेकिन प्रिंटलाइन नहीं; स्विफ्ट शैली स्ट्रिंग प्रक्षेप कभी-कभी NSLog के लिए क्रैश हो जाता है, लेकिन प्रिंटनल नहीं।
बाओ लेई

2
स्विफ्ट कंपाइलर ऑप्टिमाइज़ेशन और प्रिंट के उपयोग के बारे में एक दिलचस्प टिप्पणी () मध्यम.com
कार्ल

@ यदि मैं प्रिंट का उपयोग करता हूं तो क्या यह डिबगर कंसोल में दिखाई देता है या नहीं? या हमें डीबगप्रिंट का उपयोग करना चाहिए?

1
यदि आप उपयोग करते हैं print, तो यह Xcode के डिबग क्षेत्र में दिखाता है, जैसे debugPrint। एकमात्र अंतर यह है कि ऑब्जेक्ट की printकॉलिंग descriptionविधि समाप्त होती है , और debugPrintकॉल होती है debugDescription, जो इससे अधिक क्रिया हो सकती है description
रोब

@ हनी, यह टिप्पणी धागा अत्यधिक लंबे होने के रूप में चिह्नित किया गया था, इसलिए मैं सिर्फ आपको याद दिलाना चाहता था कि टिप्पणियां विस्तारित चर्चा या डिबगिंग सत्र के लिए नहीं हैं । यदि आपके पास कुछ ऐसा है जो एक प्रश्न के रूप में पूछा जा सकता है जो स्टैक ओवरफ्लो प्रारूप के लिए उपयुक्त है, तो कृपया इसे एक प्रश्न के रूप में पूछें ताकि हर कोई इसके उत्तर से लाभान्वित हो सके। यदि यह प्रश्न के रूप में काम नहीं करता है, तो आपको चर्चा को चैट पर ले जाना होगा। केवल स्पष्टीकरण मांगने या त्वरित अवलोकन करने के लिए आरक्षित टिप्पणियां।
कोड़ी ग्रे

80

यदि आप स्विफ्ट 2 का उपयोग कर रहे हैं , तो अब आप आउटपुट में कुछ लिखने के लिए केवल प्रिंट () का उपयोग कर सकते हैं।

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
एडम

1
IOS (9.0) में आपको उपयोग करने की आवश्यकता होती है terminator : "", जैसेprint("...", terminator: "")
खोतो नाम

आपके पहले वाक्य में कथन गलत है। NSLog () अभी भी काम करता है, यहां तक ​​कि नवीनतम स्विफ्ट 2.x में
सेबस्टियन

62

इसके अलावा, स्विफ्ट 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
DebugPrintableप्रोटोकॉल का नाम बदलकर CustomDebugStringConvertibleप्रोटोकॉल रखा गया है
फ्रैंकलिन यू

धन्यवाद, फ्रेंकलिन!
वैलेंटाइन शर्लिन

तो स्विफ्ट के descriptionलिए है debugDescriptionके रूप में पायथन के strलिए है repr?
बॉलपॉइंटबैन

हां मुझे ऐसा लगता है।
वैलेंटाइन शर्लिन

39

IOS 10.0 से रोब के जवाब में जोड़ने के लिए, Apple ने एक पूरी तरह से नया "यूनिफाइड लॉगिंग" सिस्टम पेश किया है जो मौजूदा लॉगिंग सिस्टम (ASL और Syslog, NSLog सहित) को सुपरकोड करता है, और प्रदर्शन में मौजूदा लॉगिंग दृष्टिकोणों को भी पार करता है, इसकी नई तकनीकों के लिए धन्यवाद लॉग डेटा संपीड़न और आस्थगित डेटा संग्रह।

से एप्पल :

एकीकृत लॉगिंग सिस्टम सिस्टम के सभी स्तरों पर मैसेजिंग को कैप्चर करने के लिए एक एकल, कुशल, निष्पादन योग्य एपीआई प्रदान करता है। यह एकीकृत सिस्टम मेमोरी में लॉग डेटा के भंडारण और डिस्क पर डेटा स्टोर में केंद्रीकृत करता है।

os_logपिछले लॉगिंग सिस्टम की तुलना में इसके बेहतर प्रदर्शन के कारण Apple अत्यधिक सभी प्रकार के संदेशों को लॉग इन करने के लिए आगे जाने की सलाह देता है , जिसमें जानकारी, डिबग, त्रुटि संदेश शामिल हैं, और डेवलपर्स के लिए सुविधाजनक लॉग और गतिविधि निरीक्षण की अनुमति देता है। वास्तव में, नई प्रणाली की संभावना इतनी कम है कि यह "ऑब्जर्वर इफेक्ट" का कारण नहीं बनेगी, जहां आपका बग गायब हो जाता है यदि आप लॉगिंग कमांड डालते हैं, तो बग होने के समय को बाधित करता है।

गतिविधि ट्रेसिंग का प्रदर्शन, अब नई एकीकृत लॉगिंग प्रणाली का हिस्सा है

आप इसके बारे में अधिक विवरण में यहां जान सकते हैं ।

इसे योग करने के print()लिए : सुविधा के लिए अपने व्यक्तिगत डिबगिंग के लिए उपयोग करें (लेकिन उपयोगकर्ता उपकरणों पर तैनात होने पर संदेश लॉग नहीं किया जाएगा)। फिर, os_logबाकी सब कुछ के लिए जितना संभव हो उतने लॉगिंग ( ) का उपयोग करें ।


5

एक और तरीका है जिसे dump()लॉगिंग के लिए भी इस्तेमाल किया जा सकता है:

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

एक वस्तु की सामग्री को उसके दर्पण से मानक आउटपुट तक का उपयोग करता है।

से स्विफ्ट स्टैंडर्ड लाइब्रेरी कार्य

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.