如何确定哪个对象/类正在调用全局Swift函数?

Die*_*che 6 swift

使用此代码:

func externalFunc() {
    println("How can I know which object/class is calling me?")
}

class Test {
    func callExternalFunc() {
        externalFunc()
    }
}
Run Code Online (Sandbox Code Playgroud)

在Objective-C运行时,objc_msgSend 将两个隐藏参数传递给我们发送的每条消息.他们是自我_cmd.(来源)

在上面的例子中,有没有办法知道谁在打电话externalFunc

Jaw*_*wad 19

我不确定是否有自动获取此方法的方法,但如果向函数添加String类型的默认参数并将其设置为,则可以获取此信息#function.

例如...

func externalFunc(callingFunctionName: String = #function) {
    println("Calling Function: \(callingFunctionName)")
}
Run Code Online (Sandbox Code Playgroud)

然后你会在没有添加默认参数的情况下调用它...

let test = Test()
test.callExternalFunc()
Run Code Online (Sandbox Code Playgroud)

它将打印以下内容......

"Calling Function: callExternalFunc()"
Run Code Online (Sandbox Code Playgroud)


Pix*_*dSt 7

如果您愿意修改方法签名,可以执行以下操作:

func externalFunc(file: String = #file, line: Int = #line) {
    println("calling File:\(file) from Line:\(line)")
}
Run Code Online (Sandbox Code Playgroud)

来自apple的快速博客

Swift借用了D语言的一个聪明的特性:当在默认参数列表中计算时,这些标识符(__FILE__和__LINE__)扩展到调用者的位置.

请注意,__FILE____LINE__已在Swift 2.2中折旧并已在Swift 3中删除.它们被#file#line取代.

  • 非常好的信息.我们可以使用`__FILE__`,`__LINE__`,`__FUNCTION__`和`__COLUMN__`.如果我们只有'__CALLER__`的话...... (3认同)