我正在寻找一种在 Swift 3 中创建响应协议的类型数组的方法。
这是我的问题(示例简化),我有一个名为Rule
的协议:
protocol Rule {
static func check(_ system: MySystem) -> [Inconsistency]
}
以及一些响应规则协议的类型:
struct FirstRule : Rule {
static func check(_ system: MySystem) -> [Inconsistency] {
...
}
}
struct SecondRule : Rule {
static func check(_ system: MySystem) -> [Inconsistency] {
...
}
}
现在我希望以这种方式检查我的系统:
let system = MySystem()
let inconsistencies = system.check([FirstRule, SecondRule])
为了做到这一点,我只需要写一个简单的扩展名:
extension MySystem {
func check(_ rules : [????]) -> [Inconsistency] {
var result = [Inconsistency]()
for rule in rules {
result += rule.check(self)
}
return result
}
}
那么rules
数组的类型是什么?
当然我希望保持规则检查静态,并且不想创建实例(在这种情况下,类型将是[Rule]
并且它会更容易)。
所以,如果有人可以提供帮助,我们将不胜感激。 提前谢谢。
答案 0 :(得分:1)
该死!我刚发现它!这是Rule.Type
:
但我必须将.self
添加到类型:
let inconsistencies = system.check([FirstRule.self, SecondRule.self])
func check(_ rules : [Rule.Type]) -> [Inconsistency]
非常感谢!
答案 1 :(得分:1)
如果你简化除了必需品之外的所有事情,那么更容易弄明白:
protocol Rule {
static func check()
}
struct S1 : Rule {
static func check() {}
}
struct S2 : Rule {
static func check() {}
}
现在:
let arr : [Rule.Type] = [S1.self, S2.self]
for thing in arr {
thing.check()
}