Swift:确定哪个对象叫做函数?

zum*_*zum 28 swift

我正在编写一些Swift代码,我想知道调用该函数的对象的类.我不想传递任何参数.从函数中我想知道是谁调用它.

有什么建议吗?

小智 28

如果你想使用swift做到这一点,你可以这样做:

func debug(file: String = #file, line: Int = #line, function: String = #function) -> String {
    return "\(file):\(line) : \(function)"
}
Run Code Online (Sandbox Code Playgroud)

这很简单.忽略语法高亮,这是错误的.

  • 这不回答这个问题.海报要求找到方法的调用者而不将其传递给via参数.这只是打印文件中当前类的方法/名称,与ObjC中的__PRETTY_FUNCTION__相同 (14认同)

kel*_*ket 14

要从内部访问方法的基础类,请使用以下dynamicType属性:

 self.dynamicType
Run Code Online (Sandbox Code Playgroud)

如果您想知道原始调用的来源,可以使用它NSThread来返回有关堆栈的调试信息:

 NSThread.callStackSymbols()
Run Code Online (Sandbox Code Playgroud)

此方法返回一个描述性值数组,您可以在抛出异常时看到这些值.字符串表示调用堆栈上所有当前活动的回溯.

我不想放肆,但在我看来,除了调试之外,从概念上来说,至少要知道任何和每个函数的特定方法调用的起源都没有充分的理由.如果需要检索堆栈上最后一个方法调用的类Type,为什么不实现一个允许您通过简单路径访问此信息的接口?

  • 较新的 Swift 版本:`Thread.callStackSymbols` (2认同)

gag*_*wal 10

您可以使用以下模板来了解文件中的文件,行号以及调用someFunction的函数:

func someFunction(file: String = #file, line: Int = #line, function: String = #function)
{
    NSLog("\(file.lastPathComponent):\(line) : \(function)")
}
Run Code Online (Sandbox Code Playgroud)