Last active
October 21, 2019 07:31
-
-
Save xmzio/fccd29fc945de7924b71 to your computer and use it in GitHub Desktop.
My aLog and dLog macros in Swift (to abbreviate NSLog)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Macros.swift | |
// | |
// Created by Xavier Muñiz on 6/12/14. | |
import Foundation | |
// dLog and aLog macros to abbreviate NSLog. | |
// Use like this: | |
// | |
// dLog("Log this!") | |
// | |
#if DEBUG | |
func dLog(message: String, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) { | |
NSLog("[\(filename.lastPathComponent):\(line)] \(function) - \(message)") | |
} | |
#else | |
func dLog(message: String, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) { | |
} | |
#endif | |
func aLog(message: String, filename: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) { | |
NSLog("[\(filename.lastPathComponent):\(line)] \(function) - \(message)") | |
} |
I went ahead an made String into AnyObject so that I could log out a dictionary.
Its sad that String in Swift 2.0 doesn't have lastPathComponent :(
We will need to use NSString if we still need that lastPathComponent.
https://forums.developer.apple.com/thread/13580
With Swift 2.2 you now use #filename
, #line
, etc. Here's what I have to include the fix for the %
and the .lastPathComponent
import Foundation
#if DEBUG
func dLog(message: String, filename: String = #file, function: String = #function, line: Int = #line) {
NSLog("%@","[\((filename as NSString).lastPathComponent):\(line)] \(function) - \(message)")
}
#else
func dLog(message: String, filename: String = #file, function: String = #function, line: Int = #line) {
}
#endif
func aLog(message: String, filename: String = #file, function: String = #function, line: Int = #line) {
NSLog("%@","[\((filename as NSString).lastPathComponent):\(line)] \(function) - \(message)")
}
I'm using it like this, a little more compact:
func dLog(message: String, filename: String = #file, function: String = #function, line: Int = #line) {
#if DEBUG
NSLog("[\((filename as NSString).lastPathComponent):\(line)] \(function) - \(message)")
#endif
}
In Objective-C it was widely used as DLog, and ALog with capital D and A, so i am going to keep the same convention in Swift. in my own code
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey! This is an old thread, but has been useful to me. What I don't like with the above solutions is that the message variable (with lots of possible string interpolation) gets run regardless of whether DEBUG is set or not. To solve this, laze evaluation with @autoclosure can be used (see https://developer.apple.com/swift/blog/?id=4). When I do that, I get the following which seems to work well (and also works around the issue mentioned by @timzai)