Я думаю, вы могли бы использовать что-то вроде этого ...
let filteredArray = array.compactMap { $0 as? RequiredType }
Это отфильтрует массив и вернет типизированный массив, содержащий только нужный вам тип.
Протест
Сказав это. В Swift вы должны избегать разнородных массивов, где это возможно. Массивы должны содержать только один тип элемента.
Немного о тестировании кода ...
Проверено на детской площадке ...
let array: [Any] = [1, "hello", 3, 3.1415, "world"]
let filteredArray = array.compactMap { $0 as? String }
filteredArray
Выход:
filteredArray = ["hello", "world"]
??
Редактировать 1
Вы могли бы также создать универсальную функцию примерно так ...
func filter<T>(array: [Any]) -> [T] {
return array.compactMap { $0 as? T }
}
let filteredArray: [String] = filter(array: array)
Затем выполняется фильтрация по типу выходного массива, который вы хотите.
Я не уверен, что вы имеете в виду, зная только тип, который вы хотите во время выполнения. Можете ли вы привести более конкретный пример того, что вы имеете в виду?
Редактировать 2
Другая возможность - общая функция, подобная этой ...
func filter<T>(array: [Any], byType typeObject: T) -> [T] {
return array.compactMap { $0 as? T }
}
let filteredArray = filter(array: array, byType: "some string")
Используется информация о типе второго параметра для фильтрации массива по этому типу элемента.
Редактировать 3
Если вам не нравится передавать экземпляр типа, вы можете передать сам тип ...
func filter<T>(array: [Any], byType typeObject: T.Type) -> [T] {
return array.compactMap { $0 as? T }
}
let filteredArray = filter(array: array, byType: String.self)
Но я не уверен, что еще вы получаете от этого, в первую очередь от фильтрации по строке?