Swift 调试小技巧

调用堆栈

在调试阶段,除了打断点查看当前线程的调用堆栈外,也可以使用 Thread 的方法 callStackSymbols 来获取当前的调用堆栈符号。例如我们可以用下面的代码打印当前线程的调用堆栈:

for stackSymbol in Thread.callStackSymbols {
    print(stackSymbol)
}
复制代码

打印当前代码的文件信息

有时候我们不仅需要打印指定的信息,而且需要打印当前文件名,当前方法的信息,如果手动书写这些信息将会非常麻烦,而且随着代码的改动,这些信息可能会频繁的改动。

在 Swift 中,编译器提供了几个编译符号来满足类似的需求,它们是:

符号类型描述
#fileString包含这个符号的文件的路径
#lineInt符号出现处的行号
#columnInt符号出现处的列
#functionString包含这个符号的方法名字

我们可以使用上面的编译符号写一个更好的 print 方法:

func printLog<T>(message: T,
                 file: String = #file,
                 method: String = #function,
                 line: Int = #line)
{
    print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}
复制代码

对于 log 的输出更多的开发和调试阶段,过多的输出可能对性能有所影响,所以在 Realease 版本中关闭掉向控制台输出也是软件开发中一种常见的做法。通过条件编译的方法,我们可以添加条件,并设置合适的编译配置,使 printLog 的内容在 Release 时被去掉,从而成为一个空方法:

func printLog<T>(message: T,
                    file: String = #file,
                  method: String = #function,
                    line: Int = #line)
{
    #if DEBUG
    print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
    #endif
}
复制代码

新版本的 LLVM 编译器在遇到空方法时,会将整个方法去掉,完全不去调用它,从而实现零成本。

关键字的使用

在 Swift 语言中,会有一些关键字,比如:do, if, while, for 等等。在编码的时候,我们应该尽量避免使用关键字,但如果我们必须使用 Swift 中的关键字时,可以用反引号(`)将关键词包住。例如在 RxSwift 中,使用了关键字 do 作为方法名,具体定义如下:

public func `do`(onError: ((Swift.Error) throws -> Void)? = nil,
             onCompleted: (() throws -> Void)? = nil,
             onSubscribe: (() -> ())? = nil,
             onSubscribed: (() -> ())? = nil,
             onDispose: (() -> ())? = nil)
-> Completable {
    return Completable(raw: primitiveSequence.source.do(
        onError: onError,
        onCompleted: onCompleted,
        onSubscribe: onSubscribe,
        onSubscribed: onSubscribed,
        onDispose: onDispose)
    )
}
复制代码

参考:

LOG 输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值