如何快速从被调用方法中识别调用方法

时间:2018-11-08 13:03:59

标签: ios swift

这是一个场景

func callingMethod_A {
  self.someCalculation()
}

func callingMethod_B{
  self.someCalculation()
}

func someCalculation{
//how to find who called this method? is it callingMethod_A or _B at runtime?
//bla bla
}

我们如何获得在运行时调用它的方法名称。
谢谢。

2 个答案:

答案 0 :(得分:1)

无论如何,我都为Swift代码设计了一种方法:

定义一个String参数callingFunction,并将其默认值设为#function。不要传递任何来自调用方的信息,编译器会提供调用函数的名称。

以@ Anu.Krthik的答案为基础:

func someCalculation (parameter: String, callingMethod: String = #function ) {
 print("In `\(#function)`, called by `\(callingMethod)`")
}

func foo(string: String) {
    someCalculation(parameter: string)
}

foo(string: "bar")

上面的照片

In `someCalculation(parameter:callingMethod:)`, called by `foo(string:)`

但是,请注意,如果调用方为callingFunction参数提供值,则可以颠覆该技术。如果用以下方式调用它:

func foo(string: String) {
    someCalculation(parameter: string, callingMethod: "bogusFunctionName()")
}

您将获得输出

In `someCalculation(parameter:callingMethod:)`, called by `bogusFunctionName()`

相反。

答案 1 :(得分:1)

您可以像这样使用Thread.callStackSymbols

func callingMethod_A() {
    self.someCalculation()
}

func callingMethod_B(){
    self.someCalculation()
}

func someCalculation(){
    let origin = Thread.callStackSymbols
    print(origin[0])
    print(origin[1])
}