代码之家  ›  专栏  ›  技术社区  ›  Anton Tropashko

Swift调试打印与打印

  •  1
  • Anton Tropashko  · 技术社区  · 6 年前

    有没有办法让应用程序在运行时崩溃和烧录 print() ? 覆盖 打印() 在Swift运行时使用 preconditionFailure("STOP using print()") .

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

    upd20180525:matt是对的:打印输出不转到实时控制台 对于一个真正的设备,它最终只能在LLDB控制台上运行。

    nslog输出思想会转到设备的控制台 因此,对于非调试版本,在运行时或编译时需要杀死什么? 是nslog

    这是实际需要的:

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

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

    4 回复  |  直到 6 年前
        1
  •  3
  •   matt    6 年前

    一般来说,人们的称呼 print 没有他们刚才说的名称空间 打印 . 因此,如果您声明 打印 与标准库具有相同签名的函数 打印 它将有效地“覆盖”标准库 打印 :

    func print(_ items: Any..., separator: String = ", ", terminator: String = "\n") {
        preconditionFailure("STOP using print()")
    }
    
        2
  •  8
  •   Rob Napier    6 年前

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

    @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.
    
        3
  •  2
  •   Sulthan    6 年前

    我可能会用一个简单的定制规则,迅速的皮棉。下面的技巧就可以了

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

    这是任何符合单词边界的词+ print +空格+ ( 或者任何匹配的东西 Swift.print .

    如果调用了自己的函数/方法 打印 但是,这将报告它们为假阳性。

    适用于 NSLog :

    disable_nslog:
      included: ".*\\.swift"
      name: "NSLog verbotten"
      regex: "((\\bNSLog))\\s*\\("
      message: "NSLog prohibited"
      severity: error
    
        4
  •  0
  •   Paul B    5 年前

    斯威夫特林特可以非常有助于“巴甫洛夫的狗训练”的目的,为团队。但是,如果您认为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中。