En Objective-C, vous pouvez imprimer la pile d'appels en procédant comme suit:
NSLog(@"%@", [NSThread callStackSymbols]);
Comment faites-vous cela dans Swift sans utiliser Foundation Class?
Comme le dit Jacobson, utilisez ce qui suit:
print(NSThread.callStackSymbols())
print(Thread.callStackSymbols)
C'est le code Swift. Il utilise une méthode Foundation, mais 90% ou plus de ce que vous faites sur iOS.
Notez que la mise en forme est meilleure si vous utilisez:
Thread.callStackSymbols.forEach{print($0)}
À partir de la ligne de commande du débogueur, vous pouvez taper
e Thread.callStackSymbols.forEach{print($0)}
Pour Swift 3, utilisez:
print(Thread.callStackSymbols)
ou pour un meilleur formatage
for symbol: String in Thread.callStackSymbols {
print(symbol)
}
Cela améliore un peu la sortie.
for symbol: String in NSThread.callStackSymbols() {
NSLog("%@", symbol)
}
Voici un excellent utilitaire que j'ai trouvé sur github:
https://github.com/nurun/swiftcallstacktrace
Vous obtenez un tuple (classe, méthode) de tout symbole de trace de pile afin que vous puissiez effectuer une nouvelle impression.
CallStackAnalyser.classAndMethodForStackSymbol(NSThread.callStackSymbols()[2])
J'avais besoin d'écrire le callstack dans un fichier journal, je l'ai donc modifié comme tel.
var ErrorStack = String()
Thread.callStackSymbols.forEach {
print($0)
ErrorStack = "\(ErrorStack)\n" + $0
}