Массив типов, отвечающих на протокол в Swift

#arrays #swift #types #static #swift3

#массивы #swift #типы #статический #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] бы таким, и это было бы намного проще).

Так что, если кто-нибудь может помочь, это было бы очень ценно. Заранее спасибо.

Комментарии:

1. Разве вы не говорите о массиве Rule.Type ?

2. Спасибо! Я ответил до того, как увидел ваш комментарий!

3. Чертовски интересно. На самом деле у меня был соблазн сказать, что это невозможно. Потом я понял, что это не так. 🙂

Ответ №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()
}
  

Ответ №2:

Черт! Я только что нашел это! Это Rule.Type :

Но я должен добавить .self к типам:

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

В любом случае спасибо!

Комментарии:

1. Я думаю, это то, что я сказал.