【问题标题】:Passing functions as argument when functions have different signatures当函数具有不同签名时将函数作为参数传递
【发布时间】:2018-01-10 19:56:12
【问题描述】:

我有很多答案,但我找不到我的问题的明确答案。

在 Swift 中,我有 3 种(或更多)不同的方法。它们唯一的共同点是返回类型,例如。

A(a:String)->MyType
B(a:Int,b:String,c:AnyObject,d:Whatever)->MyType
C(a:Int,b:String,c:Other)->MyType

我需要将函数作为类方法的参数传递,例如。

myClass.configureIOTDevice(configFile:String, functionToCall:A)

然后,在我要调用的这个方法的主体内部:

functionToCall()

如您所见,出现了一个问题:如何为不同的签名传递所需的参数?

感谢任何帮助、提示,以及为什么不,烂番茄:-)

【问题讨论】:

  • 谁为参数提供值?它们也可以通过吗?也许在字典里?
  • @vacawama 当然,我可以在传递之前创建 MyType,但我的问题是......有点理论问题 ;-)
  • 您可以将您的函数包装在一个闭包中,该闭包采用[String: Any] 类型的字典并将其解包并调用您的函数。然后你将字典和([String: Any]) -> MyType 闭包传递给你的函数,到时候它会调用functionToCall(dict)
  • 我希望在 performNSSelectorFromString,但它们有点有限

标签: swift function methods


【解决方案1】:

你可以这样走

func getData( functionToCall : Any) {
    if let function = functionToCall as? ()-> Void {
        function()
    }
    else if let function = functionToCall as? (String, String) -> Int {
        let result = function("a","b")
    }
}

【讨论】:

  • 你确定你在回答我的问题吗?
  • 是的,伙计。你想要什么?我应该准确粘贴您的代码吗?你有functionToCall,将任何签名传递给它。现在根据传递的签名调用它。
  • 好的,谢谢,但我一直在寻找不同的东西,这个解决方案可能会变得难以维护(每次添加新功能时,您也必须调整这个 getData 功能:我说的对吗?还是我错过了什么?)
  • 这是我们能做的最好的。如您所见,这将是回调。因此,当它调用 fuctionToCall 时,它需要知道要传递给 functionToCall 的参数。正确的?现在,如果您添加另一个函数定义,则需要更新 getData 以传递并调用正确的方法。没有它是不可能的。当它应该是 functionToCall(String, Int... etc) 时,你怎么能像 functionToCall() 一样调用 functionToCall?。
  • 好吧,正如我之前所说,我希望有一些 performNSSelectorFromString 或反射魔法
猜你喜欢
  • 2022-01-10
  • 2020-09-13
  • 2015-11-30
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多