亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

斯威夫特:print()vs println()vs NSLog()

斯威夫特:print()vs println()vs NSLog()

江戶川亂折騰 2019-11-21 12:55:43
什么之間的區別print,NSLog以及println何時該使用的呢?例如,在Python中,如果我想打印字典,我只是print myDict,但是現在有2個其他選項。我應該如何以及何時使用它們?
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

一些區別:


printvs println:


print調試應用程序時,該函數在Xcode控制臺中打印消息。


這println是Swift 2中已刪除且不再使用的變體。如果看到正在使用的舊代碼,則println現在可以安全地將其替換為print。


回到Swift 1.x,print沒有在打印字符串的末尾添加換行符,而是添加了換行符println。但如今,請print始終在字符串的末尾添加換行符,如果您不希望這樣做,請提供terminator參數""。


NSLog:


NSLog 更慢


NSLog在輸出中添加時間戳和標識符,而print不會;


NSLog語句同時出現在設備的控制臺和調試器的控制臺中,而print僅出現在調試器的控制臺中。


NSLog使用printf-style格式的字符串,例如


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

會產生:


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


從有效的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)其他子系統代表您的應用程序生成的消息區分開來時,這非常有用?;颍╞)來自其他類別或類型的消息。


您可以指定不同類型的日志信息,無論是.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很有用,因為它包含了您的時間戳信息。


的功率os_log調試具有的Xcode以外的地方進行測試iOS應用程序,當進入鮮明的救濟。例如,當測試后臺iOS應用程序進程(例如后臺獲取)時,連接到Xcode調試器會更改應用程序生命周期。因此,您經常需要在物理設備上進行測試,而不是從Xcode的調試器啟動應用程序,而是從設備本身運行應用程序。統一日志記錄使您仍然可以os_log從macOS控制臺應用程序觀看iOS設備語句。


查看完整回答
反對 回復 2019-11-21
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

如果您使用的是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:".")


查看完整回答
反對 回復 2019-11-21
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

而且,Swift 2具有debugPrint()(和CustomDebugStringConvertible協議)!

不要忘了debugPrint()其工作方式print(),但最適合的調試。


例子:


弦樂

print("Hello World!") 變成 Hello World

debugPrint("Hello World!")成為"Hello World"(行情?。?/p>

范圍

print(1..<6) 變成 1..<6

debugPrint(1..<6) 變成 Range(1..<6)

任何類都可以通過CustomDebugStringConvertible協議自定義其調試字符串表示形式。


查看完整回答
反對 回復 2019-11-21
  • 3 回答
  • 0 關注
  • 619 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號