У меня есть массив объектов различных типов и массив типов. Для каждого объекта я хотел бы перебирать массив типов и видеть, является ли объект таким типом. Что-то вроде этого:Проверьте, является ли объект экземпляром класса meta в Swift
class Parent {}
class ChildA: Parent {}
class ChildB: Parent {}
class GrandChildA: ChildA {}
var objects: [Any] = ["foo", ChildA(), ChildA(), ChildB(), GrandChildA()]
var classes = [Parent, ChildA, ChildB] // This line doesn't compile!!
for obj in objects {
for cls in classes {
if obj is cls {
NSLog("obj matches type!")
}
}
}
Это не работает, потому что вы не можете хранить классы в массиве. Как я понимаю, вы магазин тазов типа класса, такие как ChildA.self
:
ChildA().dynamicType == ChildA.self // true
Но это не ручка подклассы:
ChildA().dynamicType == Parent.self // false
Очевидно, оператор is
решает случай подкласса:
ChildA() is Parent // true
Но если я хочу использовать is
, я не знаю, как хранить типы классов в массиве.
Могу ли я выполнить то, что я хочу, используя Swift и некоторое отражение вуду?
Извините, если заголовок вводит в заблуждение - я не понимаю этого достаточно хорошо, чтобы сформировать правильный вопрос.
Сравнить https://stackoverflow.com/ q/44874126/2976878 – Hamish
@ Хамиш: Ваш ответ велик! Если вы представите его в качестве ответа здесь, я был бы рад принять его. –
Рад, что вы сочли это полезным! Может быть, так же близок как обман в этом случае – Hamish