swift debugPrint vs print

时间:2018-05-24 08:46:12

标签: swift

有没有办法让应用程序在print()运行时崩溃并刻录? 使用'print()

的实现覆盖Swift运行时中的preconditionFailure("STOP using print()")

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

UPD20180525:亚光是正确的:打印输出不会进入实时控制台 一个真实的设备,它不知何故只能在lldb控制台上。

NSLog输出思想是否会转到设备的控制台 所以需要在运行时或非编译构建的编译时被杀死 是NSLog

这是实际需要的:

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

}
#endif

(因为没有真正需要摆脱在发布版本中无害的打印)

4 个答案:

答案 0 :(得分:8)

虽然我不喜欢这个,但请不要将其作为崩溃操作。打破构建,而不是运行时。

@available(*, unavailable, message: "Our team has agreed not to use print.")
func print(_ items: Any..., separator: String = "", terminator: String = "\n") {}

这会将print的引用转换为编译时错误:

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

答案 1 :(得分:3)

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

func print(_ items: Any..., separator: String = ", ", terminator: String = "\n") {
    preconditionFailure("STOP using print()")
}

答案 2 :(得分:2)

我可能会使用swift lint和一个简单的自定义规则来完成它。以下应该做的伎俩

custom_rules:
  disable_print:
    included: ".*\\.swift"
    name: "print usage"
    regex: "((\\bprint)|(Swift\\.print))\\s*\\("
    message: "Prefer debugPrint over print"
    severity: error

这是匹配字边界+ print +空格+ (或匹配Swift.print的任何内容。

如果你有自己的函数/方法print,这会将它们报告为误报。

改编为NSLog

disable_nslog:
  included: ".*\\.swift"
  name: "NSLog verbotten"
  regex: "((\\bNSLog))\\s*\\("
  message: "NSLog prohibited"
  severity: error

答案 3 :(得分:0)

SwiftLint对于团队的“巴甫洛夫犬训练”可能非常有帮助。但是,如果您认为Lint是一个过大的杀伤力,则可以在项目中添加一个构建阶段来运行其他检查。 选择项目->构建阶段,按+按钮添加另一个阶段。创建时选择Run Script。添加为脚本正文(确保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中。