Фильтрация массива объектов по классу не работает - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть UIStackView, который содержит UIView s или объекты созданного мною класса с именем MyView.

MyView - это подкласс UIView.

Я хочу извлечь из этого массива все объекты класса MyView.

Это то, что я пробовал, и соответствующие ошибки:

let views = Array< MyView >(allViews).filter { $0 is MyView }

тип выражения неоднозначно без контекста

Мне нравятся эти сообщения, которые ничего не говорят.

let views = Array<Any>(allViews).filter { $0 is MyView }

Мне нравится, как это компилируется с Any.

В этом нет ошибок регистр, но views содержит те же объекты, что и myViews, ничего не фильтруется.

Я понимаю, что MyView является подклассом UIView, поэтому Swift тестирует здесь, если объект имеет класс UIView. Если это правда, зачем беспокоиться о разрешении программистам указывать какой-либо класс в фильтре, если он может фильтровать только некоторые классы?

Есть ли способ проверить подклассы?

1 Ответ

2 голосов
/ 09 февраля 2020

Я предполагаю, allViews - это массив UIView.

. Вы должны использовать compactMap, который будет отображаться в массив подкласса, отбрасывая любые значения nil (которые результат из as?):

let views = allViews.compactMap { $0 as? MyView }

Примечание здесь views уже имеет тип [MyView]; взгляните на сигнатуру метода compactMap, чтобы понять:

func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...