Em Objective C, você pode registrar o método que está sendo chamado usando:
NSLog(@"%s", __PRETTY_FUNCTION__)
Normalmente, isso é usado a partir de uma macro de registro.
Embora o Swift não suporte macro (eu acho), ainda gostaria de usar uma instrução de log genérica que inclua o nome da função que foi chamada. Isso é possível em Swift?
Atualização: agora uso esta função global para registro que pode ser encontrada aqui: https://github.com/evermeer/Stuff#print E que você pode instalar usando:
pod 'Stuff/Print'
Aqui está o código:
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)")
}
}
}
Que você pode usar assim:
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)
O que resultará em:
✳️ .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__)
Respostas:
Swift tem
#file
,#function
,#line
e#column
. Da linguagem de programação Swift :#file
- String - O nome do arquivo em que aparece.#line
- Int - O número da linha em que aparece.#column
- Int - O número da coluna em que começa.#function
- String - O nome da declaração em que aparece.fonte
__PRETTY_FUNCTION__
, que não é facilmente criada a partir das opções fornecidas. (Existe um__CLASS__
? Em caso afirmativo, isso ajudaria.)A partir do Swift 2.2, devemos usar:
Da linguagem de programação Swift (Swift 3.1) na página 894.
fonte
Swift 4
Esta é minha abordagem:
Faça disso uma função global e apenas chame
Bônus: você verá que o thread é executado em, [T] para um thread de fundo e [M] para o thread principal.
fonte
A partir do XCode beta 6, você pode usar
reflect(self).summary
para obter o nome da classe e__FUNCTION__
o nome da função, mas as coisas estão um pouco confusas agora. Esperançosamente, eles encontrarão uma solução melhor. Pode valer a pena usar um #define até que estejamos fora do beta.Este código:
dá resultados como este:
EDIT: Este é mais código, mas me aproximou do que eu precisava, o que acho que é o que você queria.
Ele fornece uma saída como esta:
fonte
Eu prefiro definir uma função de log global:
[Swift 3.1]
[Swift 3.0]
[Swift 2.0]
a saída é algo como:
fonte
object
parâmetro pode ser declarado como emAny
vez deT
.Aqui está uma resposta atualizada do Swift 2.
Exemplo de uso:
fonte
__FUNCTION__ becomes #function, __FILE__ becomes #file, and __LINE__ becomes #line.
Ou ligeira modificação da função com:
}
/ * produzirá um rastreamento de execução como: AppDelegate: application (_: didFinishLaunchingWithOptions :): 18 Produto: init (tipo: nome: ano: preço :): 34 FirstViewController: viewDidLoad (): 15 AppDelegate: applicationDidBecomeActive: 62 * /
fonte
Eu uso, isso é tudo o que é necessário em um arquivo swift, todos os outros arquivos irão pegá-lo (como uma função global). Quando quiser liberar o aplicativo basta comentar a linha.
fonte
Swift 3.0
fonte
Swift 3.x +
Se você não quiser o nome do arquivo inteiro , aqui está uma solução rápida para isso.
fonte
Outra maneira de registrar uma chamada de função:
fonte