为类函数创建并运行具有多个参数的Selector

时间:2014-12-18 14:02:21

标签: swift

我有一种情况,我使用一个类来进行大量规则的转换,这些规则具有以下一般形式:

  private class func rule0(inout account: String, _ version: Int) -> String? {
    return nil; // Use default rule.
  }

函数名称只会增加规则编号:rule1,rule2等...

我从外部源获取规则编号,现在想要找到一种通用方法来根据给定的规则编号调用正确的规则函数。我可以使用一个大的switch语句,但我更感兴趣的是从字符串生成一个选择器并调用它。

我的尝试让我:

let ruleFunction = Selector("rule\(rule):_:");
let result = ruleFunction(&account, version);

但这只会在第二行导致此错误:

  

'(inout String,@ limue Int) - > $ T4'与'Selector'

不同

实现这一目标的正确方法是什么?顺便说一下,“$ T4”是什么意思?该错误信息很难理解,说它很友好。

补充说明:我知道使用计时器或绕道Obj-C的方法,但我对直接和纯粹的Swift解决方案很感兴趣。如何使用Selector类?可以用来直接调用它代表什么吗?像NSTimer这样的班级如何使用它(绕道Obj-C?)?

1 个答案:

答案 0 :(得分:1)

一些不使用Selector的方法。如果所有"规则"具有相同的签名,然后你可以将它们放在一个数组中,数组中函数的索引指示规则号,如下所示:

let functionArray = [rule0, rule1, rule2, rule3]  //  etc...

然后,当需要调用该函数时,您只需使用下标访问所需的函数:

let result = functionArray[ruleNumber](account, version)

你可以用一个看起来像这样的字典做同样的事情:

let functionDict = ["rule0": rule0, "rule1": rule1]  //  etc...

然后使用从外部源获取规则编号时创建的字符串值来获取函数:

let result = functionDict["rule\(ruleNumber)"]?(account, version)

如果您无法保证rule0始终位于数组中的索引0,那么字典方法会更好。

但请注意:我已经尝试了这一点,并且我已经能够在没有inout关键字的情况下使用它,但不能使用它。我不知道这是一个错误,还是什么,但Swift似乎不想让我创建带有inout参数的函数的数组或字典。

如果您的功能绝对需要inout参数,那么我的建议无法提供帮助。如果有办法在没有inout的情况下做你想做的事情,那么这可能就是你的解决方案。