In Ziel C können Sie die aufgerufene Methode protokollieren, indem Sie:
NSLog(@"%s", __PRETTY_FUNCTION__)
Normalerweise wird dies von einem Protokollierungsmakro verwendet.
Obwohl Swift keine Makros unterstützt (glaube ich), möchte ich dennoch eine generische Protokollanweisung verwenden, die den Namen der aufgerufenen Funktion enthält. Ist das in Swift möglich?
Update: Ich verwende jetzt diese globale Funktion für die Protokollierung, die hier zu finden ist: https://github.com/evermeer/Stuff#print Und die Sie installieren können mit:
pod 'Stuff/Print'
Hier ist der Code:
public class Stuff {
public enum logLevel: Int {
case info = 1
case debug = 2
case warn = 3
case error = 4
case fatal = 5
case none = 6
public func description() -> String {
switch self {
case .info:
return "❓"
case .debug:
return "✳️"
case .warn:
return "⚠️"
case .error:
return "🚫"
case .fatal:
return "🆘"
case .none:
return ""
}
}
}
public static var minimumLogLevel: logLevel = .info
public static func print<T>(_ object: T, _ level: logLevel = .debug, filename: String = #file, line: Int = #line, funcname: String = #function) {
if level.rawValue >= Stuff.minimumLogLevel.rawValue {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss:SSS"
let process = ProcessInfo.processInfo
let threadId = "?"
let file = URL(string: filename)?.lastPathComponent ?? ""
Swift.print("\n\(level.description()) .\(level) ⏱ \(dateFormatter.string(from: Foundation.Date())) 📱 \(process.processName) [\(process.processIdentifier):\(threadId)] 📂 \(file)(\(line)) ⚙️ \(funcname) ➡️\r\t\(object)")
}
}
}
Was Sie so verwenden können:
Stuff.print("Just as the standard print but now with detailed information")
Stuff.print("Now it's a warning", .warn)
Stuff.print("Or even an error", .error)
Stuff.minimumLogLevel = .error
Stuff.print("Now you won't see normal log output")
Stuff.print("Only errors are shown", .error)
Stuff.minimumLogLevel = .none
Stuff.print("Or if it's disabled you won't see any log", .error)
Was dazu führen wird:
✳️ .debug ⏱ 02/13/2017 09:52:51:852 📱 xctest [18960:?] 📂 PrintStuffTests.swift(15) ⚙️ testExample() ➡️
Just as the standard print but now with detailed information
⚠️ .warn ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(16) ⚙️ testExample() ➡️
Now it's a warning
🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(17) ⚙️ testExample() ➡️
Or even an error
🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(21) ⚙️ testExample() ➡️
Only errors are shown
NSLog("Running %@ : %@",NSStringFromClass(self.dynamicType),__FUNCTION__)
Antworten:
Swift hat
#file
,#function
,#line
und#column
. Aus der Swift-Programmiersprache :#file
- String - Der Name der Datei, in der sie angezeigt wird.#line
- Int - Die Zeilennummer, in der es angezeigt wird.#column
- Int - Die Spaltennummer, in der es beginnt.#function
- String - Der Name der Deklaration, in der sie erscheint.quelle
__PRETTY_FUNCTION__
, die aus den gegebenen Optionen nicht einfach zu erstellen ist. (Gibt es eine__CLASS__
? Wenn ja, würde das helfen.)Ab Swift 2.2 sollten wir verwenden:
Aus der Swift-Programmiersprache (Swift 3.1) auf Seite 894.
quelle
Swift 4
Hier ist mein Ansatz:
Machen Sie dies zu einer globalen Funktion und rufen Sie einfach auf
Bonus: Sie sehen, dass der Thread ausgeführt wird, [T] für einen Hintergrund-Thread und [M] für den Haupt-Thread.
quelle
Ab XCode Beta 6 können Sie
reflect(self).summary
den Klassennamen und__FUNCTION__
den Funktionsnamen abrufen, aber die Dinge sind im Moment etwas verstümmelt. Hoffentlich finden sie eine bessere Lösung. Es könnte sich lohnen, ein #define zu verwenden, bis wir die Beta verlassen haben.Dieser Code:
gibt Ergebnisse wie diese:
EDIT: Dies ist mehr Code, hat mich aber näher an das gebracht, was ich brauchte, was ich denke, was Sie wollten.
Es gibt Ausgabe wie folgt:
quelle
Ich bevorzuge es, eine globale Protokollfunktion zu definieren:
[Swift 3.1]
[Swift 3.0]
[Swift 2.0]
Die Ausgabe ist so etwas wie:
quelle
object
Parameter alsAny
anstelle von deklariert werden könnenT
.Hier ist eine aktualisierte Swift 2-Antwort.
Anwendungsbeispiel:
quelle
__FUNCTION__ becomes #function, __FILE__ becomes #file, and __LINE__ becomes #line.
Oder leichte Funktionsänderung mit:
}}
/ * erzeugt einen Ausführungs-Trace wie: AppDelegate: application (_: didFinishLaunchingWithOptions :): 18 Produkt: init (Typ: Name: Jahr: Preis :): 34 FirstViewController: viewDidLoad (): 15 AppDelegate: applicationDidBecomeActive: 62 * /
quelle
Ich benutze, das ist alles, was in einer schnellen Datei benötigt wird, alle anderen Dateien werden es aufnehmen (als globale Funktion). Wenn Sie die Anwendung freigeben möchten, kommentieren Sie einfach die Zeile aus.
quelle
Swift 3.0
quelle
Swift 3.x +
Wenn Sie nicht den gesamten Dateinamen möchten, finden Sie hier eine schnelle Lösung dafür.
quelle
Eine andere Möglichkeit, Funktionsaufrufe zu protokollieren:
quelle