2016-10-07 20 views
2

我正在寻找一种方法来创建一个类型的数组响应协议斯威夫特3响应协议在Swift中的类型的数组

这里是我的问题(简化的例子),我有一个协议叫做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]) 

为了做到这一点,我只需要写一个SIM卡扩展名:

extension MySystem { 
    func check(_ rules : [????]) -> [Inconsistency] { 
     var result = [Inconsistency]() 

     for rule in rules { 
      result += rule.check(self) 
     } 

     return result 
    } 
} 

那么rules数组的类型是什么?

当然,我希望保持规则检查静态,并不想创建实例(在这种情况下,类型将是[Rule],它会更容易)。

因此,如果任何人都可以提供帮助,将不胜感激。 在此先感谢。

+1

你是不是在谈论'Rule.Type'的阵列? – matt

+0

谢谢!我在看到您的评论之前回答了! – Zaphod

+1

Darned有趣。我真的很想说这是不可能的。然后我意识到它不是。 :) – matt

回答

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() 
} 
1

该死!我刚刚找到它!这是Rule.Type

但我要补充.self的类型:

let inconsistencies = system.check([FirstRule.self, SecondRule.self]) 
func check(_ rules : [Rule.Type]) -> [Inconsistency] 

还是要谢谢你!

+0

我认为这就是我所说的。 – matt

+0

确实,非常感谢! – Zaphod