Классы являются экземплярами мета-типа и могут быть проверены с помощью is
и as?
. Вы можете использовать функцию generi c для передачи искомого типа:
class TypeManager {
var managedTypes:[Any.Type] = []
func findFirst<T>(_: T.Type) -> Any.Type? {
return managedTypes.first { $0 is T.Type }
}
}
Пример:
if let firstCarType = typeManager.findFirst(Car.self) {
print(firstCarType) // Honda
}
Или с условным связыванием и compactMap:
class TypeManager {
var managedTypes:[Any.Type] = []
func findFirst<T>(_: T.Type) -> T.Type? {
return managedTypes.compactMap { $0 as? T.Type }.first
}
}
Преимущество в том, что возвращаемый тип - T.Type?
, а не Any.Type?
. (Используйте managedTypes.lazy.compactMap
, если список может быть большим и требуется короткое замыкание.)