有没有办法让应用程序在print()
运行时崩溃并刻录?
使用'print()
。
preconditionFailure("STOP using print()")
基本上,这是巴甫洛夫正在进行的狗训练的一部分: 我希望人们使用debugPrint而不是打印污染 仅在调试版本中构建控制台。
UPD20180525:亚光是正确的:打印输出不会进入实时控制台 一个真实的设备,它不知何故只能在lldb控制台上。
NSLog输出思想是否会转到设备的控制台 所以需要在运行时或非编译构建的编译时被杀死 是NSLog
这是实际需要的:
#if DEBUG
#else
public func NSLog(_ format: String, _ args: CVarArg...)
{
}
#endif
(因为没有真正需要摆脱在发布版本中无害的打印)
答案 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中。