На самом деле мне на практике type erasure встречалось не так часто, но возможно где-то активно используется, так же иногда спрашивают про сокрытие типов на собесов. Статья является кратким конспектом видео с ютуба "Type Erasure (Стирание типов), Copy on write в Swift".
Начнем с примера обычной реализации протокола с associatedtype:
Когда класс просто имплементирует протокол, проблем нет:
Когда же мы указываем для параметра условие, что он должен реализовывать протокол, получаем ошибку:
Для обхода этой ошибки существует обходной путь Type Erasure - стирание типов, он так же применяется в самом Swift для AnyHashable, AnyIterator, AnySequence, AnyCollection и т.д. Это делается в три шага.
1) Создаем имитацию абстрактного класса, который имплементирует наш протокол: 2) Создаем класс-обертку от _AnyMapperBox:
2) Создаем класс-обертку от _AnyMapperBox:
3) Создаем структуру, которая имеет параметр типа нашего "абстрактного" класса, при иницилизации используем уже класс-обертку
Теперь посмотрим пример использования. Пусть у нас есть структура Article, словарь ArticleDict и соответственно нужно преобразовать входящий словарь в структуру:
Для этого используем класс ArticleService, в котором мы будем использовать уже в качестве маппера нашу структуру с третьего шага:
Теперь нам нужен создать маппер:
Для наглядности создадим второй, где будет отличаться title:
И наконец реализуем нашу задачу:
Вот, что вывелось на экран:
Жду ваших замечаний, предложений, всем добра!