在Swift中响应协议的类型数组

时间:2016-10-07 21:51:55

标签: arrays swift types static swift3

我正在寻找一种在 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]并且它会更容易)。

所以,如果有人可以提供帮助,我们将不胜感激。 提前谢谢。

2 个答案:

答案 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()
}