2015-07-08 2 views
0

Я пытаюсь написать реестр в Swift, который отображает от API (протоколов) к реализациям (классам). Я хотел бы предоставить реестр API и получить экземпляр класса, который его реализует. В Objective-C это было довольно тривиально - просто вызовите NSStringFromProtocol по протоколу, а затем используйте это как ключ для словаря, содержащего классы, которые их реализуют. Однако в Swift у нас нет этой интроспективной возможности. Когда я пытаюсь сделать то же самое, мне сказали, что MyAPI.protocol не имеет члена «mirrorType». Мой вопрос к вам заключается в том, как в Swift без использования протоколов @objc я могу сопоставить сам протокол с классом, который его реализует. Благодаря!Возможно ли хешировать протокол Swift?

+0

Это 'toString (YourProtocol.self)' что вы ищете? –

+1

Ха вводил это (или скорее «String (SomeProtocol.self)», если вы в 2.0). Однако я бы также предложил не делать этого вообще, это решение в поисках проблемы. –

+1

@AirspeedVelocity, спасибо за подсказку. Что вы подразумеваете под решением в поисках проблемы? Можете ли вы уточнить? Как еще вы могли бы реализовать этот шаблон дизайна? – AttilaTheFun

ответ

1

К настоящему времени это невозможно без использования @objc. Решение, которое я нашел в этом случае, использует имя протокола (string) в качестве ключа для словаря для этих реализаций (в моем случае у меня всегда будет только один экземпляр для протокола).

Использование @objc заставит вас иметь все ваши реализации, возвращая AnyObject эквивалент (id) в объекте-C (если ваша функция не возвращает родной объект-тип C).

Надеюсь, что это поможет.

Смежные вопросы