Is there a way to get line number and function name in Swift language?

In Objective-C, we could use the __LINE__ and __PRETTY_FUNCTION__ macros. These are not exposed in the Swift language. Is there another way to get similar information in Swift?


Solution 1:

Literal     Type              Value

#file       String            The path to the file in which it appears.
#fileID     String            The name of the file and module in which it appears.
#filePath   String            The path to the file in which it appears.
#line       Int               The line number on which it appears.
#column     Int               The column number in which it begins.
#function   String            The name of the declaration in which it appears.
#dsohandle  UnsafeRawPointer  The dynamic shared object (DSO) handle in use where it appears.

See documentation for more information

Example:

print("Function: \(#function), line: \(#line)") 

With default values in parameters you can also create a function:

public func track(_ message: String, file: String = #file, function: String = #function, line: Int = #line ) { 
    print("\(message) called from \(function) \(file):\(line)") 
}

which can be used like this

track("enters app")

Solution 2:

The Swift Language Reference defines a few "special literals" that offer this behavior:

Literal        Type     Value

#file          String   The name of the file in which it appears.
#line          Int      The line number on which it appears.
#column        Int      The column number in which it begins.
#function      String   The name of the declaration in which it appears.

Solution 3:

You can get just the file name this way

Swift 5

let errorLocation =  (#file as NSString).lastPathComponent
print(errorLocation)

or get with separator from last component

let errorLocation = filePath.components(separatedBy: "/").last!
print(errorLocation)

Output

ViewController.swift