web-dev-qa-db-de.com

Wie kann ich einen Anrufstapel in Swift drucken?

In Objective-C können Sie den Aufrufstapel folgendermaßen drucken:

NSLog(@"%@", [NSThread callStackSymbols]);

Wie machen Sie das in Swift ohne Foundation-Klasse?

36
Boon

Wie Jacobson sagt, benutze folgendes:

Swift 2:

print(NSThread.callStackSymbols())

Swift 3/Swift 4:

print(Thread.callStackSymbols)

Das ist ein schneller Code. Es wird eine Foundation-Methode verwendet, jedoch auch mehr als 90% dessen, was Sie unter iOS tun.

BEARBEITEN:

Beachten Sie, dass die Formatierung besser aussieht, wenn Sie Folgendes verwenden:

Thread.callStackSymbols.forEach{print($0)}

Über die Debugger-Befehlszeile können Sie eingeben 

e Thread.callStackSymbols.forEach{print($0)}
63
Duncan C

Für Swift 3 verwenden:

print(Thread.callStackSymbols)

oder für eine bessere Formatierung

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

Dies verbessert die Leistung etwas.

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

Hier ist eine tolle Utility-Klasse, die ich auf Github gefunden habe:

https://github.com/nurun/swiftcallstacktrace

Sie erhalten ein Tuple (Klasse, Methode) eines beliebigen Stack-Trace-Symbols, damit Sie einen sauberen Ausdruck ausführen können.

CallStackAnalyser.classAndMethodForStackSymbol(NSThread.callStackSymbols()[2])
2
Mike S

Ich musste den Callstack in eine Protokolldatei schreiben, also habe ich ihn so angepasst. 

var ErrorStack = String()
Thread.callStackSymbols.forEach {
    print($0)
    ErrorStack = "\(ErrorStack)\n" + $0
}
0
Breathable