সুইফ্ট: প্রিন্ট () বনাম প্রিন্টলান () বনাম এনএসলগ ()


449

মধ্যে পার্থক্য কি print, NSLogএবং printlnযখন আমি প্রতিটি ব্যবহার করা উচিত?

উদাহরণস্বরূপ, পাইথনে আমি যদি একটি অভিধান মুদ্রণ করতে চাই, আমি print myDictঠিকই থাকি, তবে এখন আমার কাছে আরও 2 টি বিকল্প রয়েছে। আমার কখন এবং কখন ব্যবহার করা উচিত?



2
এনএসএলগ এবং এনএসডি অভিধান মুদ্রণ সম্পর্কে কী আমাকে দরকারী কিছু দেয় না?
ব্যবহারকারী 17

আইওএস 10.0 থেকে এগিয়ে এটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে os_logনীচে আমার উত্তর দেখুন
হুয়াথাম

এতে সুইফ্ট ডকুমেন্টেশনটি ছাড়াও os_log: অবজেক্টিভ-সি পৃষ্ঠার সম্পূর্ণ ডকুমেন্টেশন দেখার চেষ্টা করুন । এটি আরও অনেক সম্পূর্ণ
মধু

উত্তর:


756

কয়েকটি পার্থক্য:

  1. printবনাম println:

    printXcode কনসোলে ফাংশন কপি করে প্রিন্ট বার্তা যখন অ্যাপ্লিকেশান ডিবাগ।

    printlnএই একটি প্রকরণ যে সুইফট 2 সরানো হয়েছে এবং আর কোনো ব্যবহার করা হয়। আপনি যদি পুরানো কোডটি ব্যবহার করছেন তা যদি আপনি দেখতে পান তবে আপনি printlnএখন নিরাপদে এটিকে এটির সাথে প্রতিস্থাপন করতে পারেন print

    সুইফট 1.x এ ফিরে, printমুদ্রিত স্ট্রিংয়ের শেষে নতুন লাইনের অক্ষর যুক্ত করা printlnহয়নি , যেখানে হয়েছে । তবে আজকাল, printসবসময় স্ট্রিংয়ের শেষে নিউলাইন চরিত্রটি যুক্ত করুন এবং আপনি যদি এটিটি না করতে চান তবে একটি terminatorপ্যারামিটার সরবরাহ করুন ""

  2. NSLog:

    • NSLog ধীর;

    • NSLogআউটপুটে একটি টাইমস্ট্যাম্প এবং শনাক্তকারী যুক্ত করে, যেখানে তা printহবে না;

    • NSLogবিবৃতিগুলি ডিভাইসের কনসোল এবং ডিবাগারের কনসোল উভয়তেই উপস্থিত হয় যেখানে printকেবল ডিবাগার কনসোলটিতে উপস্থিত হয়।

    • NSLogব্যবহার printf-style বিন্যাস স্ট্রিং যেমন

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

      এটি উত্পাদন করবে:

      2017-06-09 11: 57: 55.642328-0700 মাই অ্যাপ [28937: 1751492] 3.1416

  3. কার্যকর আইওএস 10 / ম্যাকোস 10.12, একটি তৃতীয় বিকল্প রয়েছে, os_log"ইউনিফাইড লগিং" সিস্টেমের অংশ (ডাব্লুডাব্লুডিসি 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)

      আপনি যখন বাহ্যিক কনসোল অ্যাপ্লিকেশনটির মাধ্যমে অ্যাপটি পর্যবেক্ষণ করেন, আপনি কেবলমাত্র এই কলামগুলিকে মূল দৃশ্যে যুক্ত করতে পারবেন না, তবে আপনি এর ভিত্তিতে ফিল্টার করতে পারেন। এটি খুব কার্যকর যখন আপনার ডিবাগিং বার্তাগুলিকে (ক) আপনার অ্যাপের পক্ষে অন্য সাবসিস্টেমগুলি দ্বারা উত্পাদিত থেকে আলাদা করতে চান; বা (খ) অন্যান্য বিভাগ বা প্রকারের বার্তা।

    • আপনার বার্তা লগিং বিভিন্ন ধরনের নির্দিষ্ট করতে পারেন, হয় .info, .debug, .error, .fault(অথবা .default):

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

      সুতরাং, যদি বাহ্যিক কনসোল অ্যাপ্লিকেশন ব্যবহার করা হয় তবে আপনি কেবল নির্দিষ্ট বিভাগের বার্তা দেখতে বাছাই করতে পারেন (উদাহরণস্বরূপ যদি আপনি কনসোল "অ্যাকশন" মেনুতে "ডিবাগ বার্তা অন্তর্ভুক্ত করুন" বেছে নেন তবে ডিবাগিং বার্তাগুলি প্রদর্শন করুন)। এই সেটিংসে ডিস্কে লগ ইন করা আছে কি না সে সম্পর্কে অনেক সূক্ষ্ম ইস্যুর বিশদও নির্দেশ করে ate আরও তথ্যের জন্য ডাব্লুডাব্লুডিসি ভিডিও দেখুন।

    • আপনি ব্যবহার করার সময় স্ট্রিং ইন্টারপোলেশন ব্যবহার করতে পারবেন না os_log। উদাহরণস্বরূপ আপনি এটি করতে পারবেন না:

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

      আপনাকে করতে হবে:

      os_log("url = %@", url.absoluteString)
    • উপরের সীমাবদ্ধতার অন্যতম কারণ হ'ল ডেটা প্রাইভেসি সমর্থন করা। প্রাথমিক তথ্য প্রকারগুলি (যেমন সংখ্যা) ডিফল্টরূপে সর্বজনীন এবং অবজেক্টস (যেমন স্ট্রিং) ডিফল্টরূপে ব্যক্তিগত। পূর্ববর্তী উদাহরণে যেখানে আপনি ইউআরএল লগ করেছেন, অ্যাপটি যদি ডিভাইস থেকেই শুরু করা হয়েছিল এবং আপনি আপনার ম্যাকের কনসোল অ্যাপ্লিকেশনটি দেখছিলেন, তবে আপনি দেখতে পাবেন:

      url = <গোপনীয়তা>

      আপনি যদি এটি বাহ্যিক ডিভাইস থেকে দেখতে চান তবে আপনাকে করতে হবে:

      os_log("url = %{public}@", url.absoluteString)
    • দ্রষ্টব্য, NSLogএখন পর্দার আড়ালে একীভূত বিজ্ঞপ্তি সিস্টেম ব্যবহার করে তবে নিম্নলিখিত সতর্কতা সহ:

      • আপনি সাবসিস্টেম বা বিভাগ বা লগ প্রকার নিয়ন্ত্রণ করতে পারবেন না;

      • এটি গোপনীয়তা সেটিংস সমর্থন করে না।

নীচের লাইনটি printসহজ কাজের জন্য যথেষ্ট তবে NSLogএটি কার্যকর কারণ এটি আপনার জন্য টাইমস্ট্যাম্পের তথ্য অন্তর্ভুক্ত করে।

os_logএক্সকোডের বাইরে পরীক্ষা করতে হবে এমন আইওএস অ্যাপ্লিকেশনগুলি ডিবাগ করার সময় এর শক্তি একেবারে স্বস্তিতে আসে। উদাহরণস্বরূপ, ব্যাকগ্রাউন্ড আইওএস অ্যাপ্লিকেশন প্রক্রিয়াগুলি ব্যাকগ্রাউন্ড আনার মতো পরীক্ষার সময়, এক্সকোড ডিবাগারের সাথে সংযুক্ত থাকা অ্যাপ্লিকেশনটির জীবনচক্র পরিবর্তন করে । সুতরাং, আপনি প্রায়শই শারীরিক ডিভাইসে পরীক্ষা করতে চান, ডিভাইস থেকে নিজেই অ্যাপ চালাচ্ছেন, এক্সকোডের ডিবাগার থেকে অ্যাপটি শুরু না করে starting ইউনিফাইড লগিং আপনাকে os_logম্যাকস কনসোল অ্যাপ্লিকেশন থেকে আপনার আইওএস ডিভাইসের স্টেটমেন্টগুলি এখনও দেখতে দিন ।


37
চমৎকার সারসংক্ষেপ! আরও কয়েকটি যুক্ত করতে: আপনি এনএসএসআর্টিং এ প্রিন্টলনে যেতে পারেন তবে এনএসএলগ নয়; আপনি এনএসএলগের জন্য আরগ যোগ করতে পারেন, তবে প্রিন্টলন নয়; সুইফ্ট স্টাইলের স্ট্রিং ইন্টারপোলেশন কখনও কখনও এনএসলোগের জন্য ক্র্যাশ করে তবে প্রিন্টলন হয় না।
বাও লেই

2
সুইফ্ট সংকলক অপ্টিমাইজেশান এবং মুদ্রণ () মিডিয়াম.com
কার্ল

@ রব যদি আমি মুদ্রণ ব্যবহার করি তবে এটি কি ডিবাগার কনসোলে উপস্থিত হবে না? বা আমাদের ডিবাগপ্রিন্ট ব্যবহার করা উচিত?

1
আপনি যদি ব্যবহার printকরেন তবে এটি এক্সকোডের ডিবাগ এরিয়াতে প্রদর্শিত হবে debugPrint। পার্থক্যটি হ'ল অবজেক্টের printকলিং descriptionপদ্ধতি এবং debugPrintকলগুলি শেষ হয় যা এর debugDescriptionচেয়ে বেশি ভার্বোস হতে পারে description
রব

@Honey, এই মন্তব্য থ্রেড বেজায় লম্বা হচ্ছে, তাই আমি ঠিক আপনাকে মনে করিয়ে দিতে যে মন্তব্য নেই চেয়েছিলেন হিসাবে পতাকাঙ্কিত পেয়েছিলাম না বর্ধিত আলোচনা বা ডিবাগ সেশন জন্য। আপনার যদি এমন কিছু থাকে যা স্ট্যাক ওভারফ্লো ফর্ম্যাটের জন্য উপযুক্ত এমন প্রশ্ন হিসাবে জিজ্ঞাসা করা যায়, তবে দয়া করে এটিকে একটি প্রশ্ন হিসাবে জিজ্ঞাসা করুন যাতে প্রত্যেকে এর উত্তরগুলি থেকে উপকৃত হতে পারে। যদি এটি কোনও প্রশ্ন হিসাবে কাজ না করে, তবে আপনাকে আড্ডায় আলোচনার প্রয়োজন হবে। শুধুমাত্র স্পষ্টতা জিজ্ঞাসা করার জন্য বা দ্রুত পর্যবেক্ষণ করার জন্য মন্তব্যগুলি সংরক্ষণ করুন।
কোডি গ্রে

79

আপনি যদি সুইফট 2 ব্যবহার করেন তবে এখন আপনি আউটপুটটিতে কিছু লিখতে কেবল মুদ্রণ () ব্যবহার করতে পারেন।

অ্যাপল প্রিন্টলন () এবং মুদ্রণ () ফাংশন দুটি এক সাথে সংযুক্ত করেছে ।

আইওএস 9 এ আপডেট হয়েছে

ডিফল্টরূপে, ফাংশনটি একটি লাইন বিরতি যুক্ত করে প্রিন্ট করা লাইনটি সমাপ্ত করে।

print("Hello Swift")

টার্মিনেটর

এর পরে লাইন ব্রেক ছাড়া মান মুদ্রণ করতে, খালি স্ট্রিংটি টার্মিনেটর হিসাবে পাস করুন

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

বিভাজক

আপনি এখন একাধিক আইটেম সংযুক্ত করতে বিভাজক ব্যবহার করতে পারেন

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

উভয়

অথবা আপনি এইভাবে ব্যবহার করে একত্রিত করতে পারেন

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

5
appendNewlineএর ডিফল্ট মান রয়েছেtrue
আদম

1
আইওএস (9.0) এ আপনাকে ব্যবহার করা দরকার terminator : "", উদাহরণস্বরূপprint("...", terminator: "")
খোতু নাম

আপনার প্রথম বাক্যে বিবৃতিটি ভুল। এনএসএলগ () এখনও কাজ করে এমনকি সাম্প্রতিক সুইফট ২.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

রবের জবাব যোগ করতে আইওএস ১০.০ থেকে অ্যাপল একটি সম্পূর্ণ নতুন "ইউনিফাইড লগিং" সিস্টেম চালু করেছে যা বিদ্যমান লগিং সিস্টেমগুলিকে ছাড়িয়ে যায় (এএসএল এবং সিসলগ, এনএসলোগ সহ), এবং কার্য সম্পাদনে বিদ্যমান লগিং পদ্ধতির ছাড়িয়ে গেছে, এর নতুন কৌশলগুলি সহ ধন্যবাদ জানায় লগ ডেটা সংক্ষেপণ এবং স্থগিত ডেটা সংগ্রহ।

অ্যাপল থেকে :

ইউনিফাইড লগিং সিস্টেমটি সিস্টেমের সমস্ত স্তরের জুড়ে মেসেজিং ক্যাপচারের জন্য একটি একক, দক্ষ, পারফরম্যান্ট এপিআই সরবরাহ করে। এই ইউনিফাইড সিস্টেমটি মেমরিতে এবং ডিস্কে একটি ডেটা স্টোরে লগ ডেটা সঞ্চয় করার কেন্দ্রিক করে তোলে।

অ্যাপল উচ্চতর প্রস্তাব 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.