#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. Я думаю, это то, что я сказал.