有没有办法用 Swift 语言得到行号和函数名?

在 Objective-C 中,我们可以使用 __LINE____PRETTY_FUNCTION__宏。这些在 Swift 语言中没有暴露出来。在 Swift 中还有其他获取类似信息的方法吗?

20965 次浏览

快速语言参考定义中的一些“特殊文字”提供了这种行为:

字面意思 类型 价值
# file 绳子 它出现在其中的文件的名称。
# 线 内景 它出现的行号。
# 专栏 内景 它开始的列号。
# 功能 绳子 它出现在其中的声明的名称。
字面意思 类型 价值
# file 绳子 它出现在其中的文件的路径。
# fileID 绳子 它出现在其中的文件和模块的名称。
# filePath 绳子 它出现在其中的文件的路径。
# 线 内景 它出现的行号。
# 专栏 内景 它开始的列号。
# 功能 绳子 它出现在其中的声明的名称。
# dsohandle UnsafeRawPointer 出现时使用的动态共享对象(DSO)句柄。

有关更多信息,请参见文档

例如:

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

使用参数中的默认值,您还可以创建一个函数:

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

可以像这样使用

track("enters app")

您可以通过这种方式获得文件名

Swift 5

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

或从最后一个组件分离

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

输出

ViewController.swift

如果要获取函数的调用站点位置,则需要将文件名和行作为默认参数传递。

TraceSwift

func trace(_ msg: String, file: String = #fileID, line: Int = #line) {
let pos = "\(file.split(on: "/").last!):\(line)"
print("\(pos): \(msg))
}

Foo Swift

func bar() {
trace("baz!")
}

输出

Foo.swift:8: baz!