web-dev-qa-db-fra.com

Comment imprimer la pile d'appels dans Swift?

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?

36
Boon

Comme le dit Jacobson, utilisez ce qui suit:

Swift 2:

print(NSThread.callStackSymbols())

Swift 3/Swift 4:

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.

MODIFIER:

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)}
63
Duncan C

Pour Swift 3, utilisez:

print(Thread.callStackSymbols)

ou pour un meilleur formatage

for symbol: String in Thread.callStackSymbols {
    print(symbol)
}
10
Doug Amos

Cela améliore un peu la sortie.

for symbol: String in NSThread.callStackSymbols() {
    NSLog("%@", symbol)
}
5
Kevin Snow

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])
2
Mike S

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
}
0
Breathable