Swift 快速打印vs打印

Swift 快速打印vs打印,swift,Swift,有没有办法让应用程序在运行时崩溃并在打印时刻录? 在Swift运行时使用一个可能会停止使用打印的实现覆盖打印 基本上,这是巴甫洛夫团队正在进行的狗训练的一部分: 我希望人们使用debugPrint,而不是污染环境的打印 仅调试版本中的控制台 UPD20180525:马特是对的:打印输出不会进入实时控制台 对于一个真正的设备,它只会以某种方式出现在lldb控制台上 NSLog输出思想确实进入设备控制台 那么,对于非调试构建,在运行时或编译时需要消除什么呢 是NSLog吗 这是实际需要的: #if

有没有办法让应用程序在运行时崩溃并在打印时刻录? 在Swift运行时使用一个可能会停止使用打印的实现覆盖打印

基本上,这是巴甫洛夫团队正在进行的狗训练的一部分: 我希望人们使用debugPrint,而不是污染环境的打印 仅调试版本中的控制台

UPD20180525:马特是对的:打印输出不会进入实时控制台 对于一个真正的设备,它只会以某种方式出现在lldb控制台上

NSLog输出思想确实进入设备控制台 那么,对于非调试构建,在运行时或编译时需要消除什么呢 是NSLog吗

这是实际需要的:

#if DEBUG
#else
public func NSLog(_ format: String, _ args: CVarArg...)
{

}
#endif

因为没有真正的需要摆脱在发布版本中无害的print

一般来说,人们称print的方式没有名称空间——他们只是说print。因此,如果声明的全局打印函数具有与标准库打印相同的签名,它将有效覆盖标准库打印:


一般来说,人们调用print的方式没有名称空间——他们只是说print。因此,如果声明的全局打印函数具有与标准库打印相同的签名,它将有效覆盖标准库打印:


虽然我不喜欢这个,但请不要让它成为一个崩溃的操作。中断生成,而不是运行时

@available(*, unavailable, message: "Our team has agreed not to use print.")
func print(_ items: Any..., separator: String = "", terminator: String = "\n") {}
这会将要打印的引用转换为编译时错误:

error: 'print(_:separator:terminator:)' is unavailable: Our team has agreed not to use print.

虽然我不喜欢这个,但请不要让它成为一个崩溃的操作。中断生成,而不是运行时

@available(*, unavailable, message: "Our team has agreed not to use print.")
func print(_ items: Any..., separator: String = "", terminator: String = "\n") {}
这会将要打印的引用转换为编译时错误:

error: 'print(_:separator:terminator:)' is unavailable: Our team has agreed not to use print.

我可能会使用swift lint和一个简单的自定义规则来完成。下面的内容应该可以做到这一点

custom_rules:
  disable_print:
    included: ".*\\.swift"
    name: "print usage"
    regex: "((\\bprint)|(Swift\\.print))\\s*\\("
    message: "Prefer debugPrint over print"
    severity: error
这是任何匹配单词边界+打印+空格+或任何匹配Swift.print的内容

如果您有自己的函数/方法称为print,则会将它们报告为假阳性

适用于NSLog:


我可能会使用swift lint和一个简单的自定义规则来完成。下面的内容应该可以做到这一点

custom_rules:
  disable_print:
    included: ".*\\.swift"
    name: "print usage"
    regex: "((\\bprint)|(Swift\\.print))\\s*\\("
    message: "Prefer debugPrint over print"
    severity: error
这是任何匹配单词边界+打印+空格+或任何匹配Swift.print的内容

如果您有自己的函数/方法称为print,则会将它们报告为假阳性

适用于NSLog:


斯威夫特林特对巴甫洛夫的团队犬训练非常有帮助。但是,如果您认为LICT是过度的,那么您可以在项目中添加一个构建阶段来运行额外的检查。 选择项目->构建阶段,按+按钮添加另一个阶段。选择“创建时运行脚本”。添加为脚本主体确保Shell为/bin/sh:

RESTRICTEDFUNCS="((\\bprint)|(Swift\\.print))\\s*\\(|((\\bNSLog))\\s*\\("
find "${SRCROOT}" \( -name "*.swift" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($RESTRICTEDFUNCS).*\$" | \
perl -p -e "s/($RESTRICTEDFUNCS)/ warning: Use of this func is undesireable: \$1/"

这种方法可以很容易地根据您的需要进行微调,并且对团队很有帮助,因为它带来了regexp的强大功能,同时不需要依赖项,也不需要安装。纯粹在Xcode中。

SwiftLint对于巴甫洛夫的团队犬训练非常有帮助。但是,如果您认为LICT是过度的,那么您可以在项目中添加一个构建阶段来运行额外的检查。 选择项目->构建阶段,按+按钮添加另一个阶段。选择“创建时运行脚本”。添加为脚本主体确保Shell为/bin/sh:

RESTRICTEDFUNCS="((\\bprint)|(Swift\\.print))\\s*\\(|((\\bNSLog))\\s*\\("
find "${SRCROOT}" \( -name "*.swift" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($RESTRICTEDFUNCS).*\$" | \
perl -p -e "s/($RESTRICTEDFUNCS)/ warning: Use of this func is undesireable: \$1/"

这种方法可以很容易地根据您的需要进行微调,并且对团队很有帮助,因为它带来了regexp的强大功能,同时不需要依赖项,也不需要安装。纯粹在Xcode中。

为什么不定义一个linting,例如swiftlint规则?您可以轻松地将项目设置为在打印时抛出编译警告/错误。并且不要将打印替换为debugPrint。创建一个日志记录程序,通过这种方式,您可以控制日志的去向,并以合理的格式保存日志。不要试图打破斯威夫特。没有明智的方法来实现你所描述的。有了记录器,如果对您来说很关键的话,您甚至可以在git提交钩子中grep for print。但是解决所有这些问题的正确方法是代码检查,而不是让程序崩溃的技巧。当你说我想让人们…你是说我的团队已经同意我们都想要…如果不是,那么你需要先修复那部分,其余的都会自然而然地出现。所以很难看出印刷品会有什么危害,因为当发行版的应用程序在设备上运行时,它不会起任何作用。对,我有一个调试工具,只在当前调试场景需要时才将调试域发送垃圾邮件。只需要跟踪和终止绕过该工具和debugprint的print语句,为什么不为此定义一个linting,例如swiftlint规则?您可以轻松地将项目设置为在打印时抛出编译警告/错误。并且不要将打印替换为debugPrint。创建一个日志记录程序,通过这种方式,您可以控制日志的去向,并以合理的格式保存日志。不要试图打破斯威夫特。没有明智的方法来实现你所描述的。有了记录器,如果对您来说很关键的话,您甚至可以在git提交钩子中grep for print。但解决所有这些问题的正确方法是
是代码检查,而不是程序崩溃的技巧。当你说我想让人们…你是说我的团队已经同意我们都想要…如果不是,那么你需要先修复那部分,其余的都会自然而然地出现。所以很难看出印刷品会有什么危害,因为当发行版的应用程序在设备上运行时,它不会起任何作用。对,我有一个调试工具,只在当前调试场景需要时才将调试域发送垃圾邮件。只需要跟踪并消除绕过该工具和DebugPrint的print语句编译时解决方法就是我最终使用的方法,但考虑到我从未梦想过编译时选项并要求matt提供运行时解决方案,我不得不勉强向matt提供了可接受的答案。这是理所当然的,但还是把它投给你吧。我觉得我欠你一个解释。你解决这个问题的编译时方法就是我最终使用的方法,但考虑到我从未梦想过编译时选项,并要求matt提供一个运行时解决方案,我不得不勉强向matt提供一个可接受的答案。这是理所当然的,但还是把它投给你吧。只是觉得我欠你一个解释。谢谢。我们信任regexp。只要是别人设计的。我们信任regexp。只要是别人设计的