Проверка соответствия динамической коллекции метатипов c - PullRequest
1 голос
/ 02 мая 2020

Я хотел бы написать быструю функцию, которая, учитывая набор метатипов, проверяет, соответствует ли другой метатип любому из них.

Обобщения не работают здесь, потому что тип target неизвестно во время компиляции.

protocol Drinkable {}
protocol Edible {}
struct Bread: Edible {}

func conforms<T>(_ itemType: Any.Type, to target: T.Type) -> Bool {
    itemType is T.Type
}

func conformsToAny(_ type: Any.Type, to types: [Any.Type]) {
    types.contains {type in
        conforms(Bread.self, to: type) // 
    }
}

conformsToAny(Bread.self, to: [Drinkable.self, Edible.self])

Возможно ли это?

1 Ответ

2 голосов
/ 02 мая 2020

То, что вы хотите сделать, невозможно. Поскольку conforms<T>(_:to:) - это generi c, тип параметра generi c должен быть известен во время компиляции.

У вас есть несколько вариантов. Во-первых, вы можете определить новый метод, который проверяет тип на соответствие всем рассматриваемым протоколам:

func isIngestible(_ type: Any.Type) -> Bool {
    return conforms(type, to: Drinkable.self)
    || conforms(type, to: Edible.self)
}

Или определить новый мастер-протокол, которому соответствуют ваши другие протоколы:

protocol Ingestible {}

protocol Drinkable: Ingestible {}
protocol Edible: Ingestible {}

struct Bread: Edible {}
struct Tire {}

print(conforms(Bread.self, to: Ingestible.self))
print(conforms(Tire.self, to: Ingestible.self))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...