Objective-Cでは、次を実行してコールスタックを印刷できます。
NSLog(@"%@", [NSThread callStackSymbols]);
Foundationクラスを使用せずにSwiftでこれを行うにはどうすればよいですか?
ジェイコブソンが言うように、次を使用します。
print(NSThread.callStackSymbols())
print(Thread.callStackSymbols)
これはSwiftコードです。Foundationメソッドを使用していますが、iOSで行っていることの90%以上を使用しています。
以下を使用する場合、フォーマットがより良く見えることに注意してください。
Thread.callStackSymbols.forEach{print($0)}
デバッガーのコマンドラインから次のように入力できます。
e Thread.callStackSymbols.forEach{print($0)}
Swift 3を使用:
print(Thread.callStackSymbols)
またはより良いフォーマットのために
for symbol: String in Thread.callStackSymbols {
print(symbol)
}
これにより、出力が少し改善されます。
for symbol: String in NSThread.callStackSymbols() {
NSLog("%@", symbol)
}
Githubで見つけた素晴らしいユーティリティクラスを次に示します。
https://github.com/nurun/swiftcallstacktrace
任意のスタックトレースシンボルのタプル(クラス、メソッド)を取得するので、きれいに印刷できます。
CallStackAnalyser.classAndMethodForStackSymbol(NSThread.callStackSymbols()[2])
コールスタックをログファイルに書き込む必要があるため、そのように調整しました。
var ErrorStack = String()
Thread.callStackSymbols.forEach {
print($0)
ErrorStack = "\(ErrorStack)\n" + $0
}