什么之间的区别print
,NSLog
以及println
何时该使用的呢?
例如,在Python中,如果我想打印字典,我只是print myDict
,但是现在有2个其他选项。我应该如何以及何时使用它们?
一些区别:
print
vs 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)其他子系统代表您的应用程序生成的调试消息区分开来时,这非常有用。或(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
很有用,因为它包含了您的时间戳信息。
的功率os_log
调试具有的Xcode以外的地方进行测试iOS应用程序,当进入鲜明的救济。例如,当测试后台iOS应用程序进程(例如后台获取)时,连接到Xcode调试器会更改应用程序生命周期。因此,您经常需要在物理设备上进行测试,从设备本身运行应用程序,而不是从Xcode的调试器启动应用程序。统一日志记录使您仍然可以os_log
从macOS控制台应用程序观看iOS设备语句。
问题内容: 我正在学习快速,并试图理解字典。我已经习惯了PHP,您可能会在其中编写以下内容… 在此示例中,将按以下顺序输出值:1、2、3 我的快速代码看起来像这样… 但是,值以意外的顺序出现。我可以做些干净的事情来保持值的创建顺序,还是不能对字典进行快速排序? 问题答案: 正如已经回答的那样,词典的要点是未排序。Swift(和Objective-C)中有三种类型的集合 数组是项目的有序列表。当项目
问题内容: 为了在使用Swift时与C API集成,我需要使用sizeof函数。在C语言中,这很容易。在Swift中,我处于类型错误的迷宫中。 我有以下代码: 第二行显示错误“’NSNumber’不是’T.Type’的子类型”。为什么会这样,我该如何解决? 问题答案: 使用sizeof如下: 使用类型作为参数。 如果您想要变量的大小,可以将该字段传递给。 像这样: 或更简单地说(由user1020
问题内容: NS和非NS类之间有什么区别?特别是vs ?是否代表围绕核心非功能性的某种包装器? 问题答案: Swift 3 为现有Foundation类类型引入了一些新的 覆盖值类型 ,例如for ,for 等。完整列表和详细信息可以在下面找到 SE-0069变异性和基础价值类型 一些原因是 提供适当的值语义, 而不是可变且不可变的变体, 更多的“ Swifty” API。 新的叠加层类型应提供相
问题内容: 我一直在尝试实现单例,以用作我从网络上传到我的iOS应用的照片的缓存。我在下面的代码中附加了三个变体。我试图使版本2正常工作,但是它导致了我不理解的编译器错误,并希望就我做错的事情寻求帮助。变体1进行缓存,但我不喜欢使用全局变量。变体3并没有进行实际的缓存,我相信这是因为我在赋给var ic = ....的赋值中获得了副本,对吗? 任何反馈和见解将不胜感激。 谢谢Zvi 问题答案: 标
问题内容: 要找到第一个,请使用: 我如何找到第二次出现? 问题答案: 项目清单 您可以按照以下步骤在剩余的数组切片中再次搜索元素的索引: 编辑/更新: Xcode 11•Swift 5.1或更高版本 测试:
问题内容: 函数定义中的下划线是什么意思? 例如 我了解在定义函数时,我可以执行以下操作: 然后,我将其称为而不是,即故意隐藏参数名称吗? 问题答案: Swift需要一个约定来说明函数名称是什么,不仅包括函数名称本身(在括号之前),还包括参数的外部名称。约定是名称后跟冒号。因此,这是一个函数声明(在Swift 2.0中): 这是该函数的名称: 但是,在现实生活中,一个或多个参数有可能(实际上)不会