2015-04-04 2 views
2

Задача проста: мне нужно создать оболочку, которая делегирует все на обернутый объект. Только тип обернутого объекта - это протокол, который содержит необязательные методы. Моя оболочка должна реализовать тот же протокол.Как обернуть протокол дополнительными методами?

Что мне делать с дополнительными методами? Я могу:

  1. Я могу реализовать их в своей обертке. Но если они не реализуются объектом, который обертывается, что я возвращаю из этой реализации?
  2. Не применять их. В этом случае объект-оболочка не будет предоставлять некоторые функции обернутого объекта, который я не хочу.

Есть ли лучшие варианты? Обратите внимание, что я работаю в Swift.

+0

Я уверен, что вы не можете сделать это в Swift, вам понадобится Obj-C, особенно доступ к 'NSInvocation'. Или просто игнорируйте необязательные методы, так как в любом случае есть функция Obj-C. Они не существуют в чистом Свифте. – Sulthan

+0

Я знаю [этот ответ] (http://stackoverflow.com/a/18777565/2792531) является Objective-C, но для ясности вы пытаетесь выполнить что-то подобное в Swift? – nhgrif

ответ

0

Если вы используете дополнительные методы, вы будете использовать среду выполнения Objective-C. Это означает, что вы можете запросить, реагирует ли объект на необязательный метод, лучше поясняется here.

Если вы новичок в режиме выполнения Objective-C, вы можете узнать больше об этом на Objective-C Runtime Programming Guide.

Я думаю, что оболочка должна проверять реализацию во время выполнения, а если отсутствует, то должна возвращать какой-то индикатор, возможно, при вызове одного из этих необязательных методов.

+0

Конечно, я могу определить, реализует ли обернутый объект дополнительный метод во время выполнения. К тому времени, однако, метод в оболочке либо реализован, либо нет ... Это приводит нас к вашему предложению о проверке реализации во время выполнения и возвращении bool или что-то еще. Обертка будет видна клиентам только как протокол (тот же протокол, что и тот, который используется как тип обернутого объекта). Я не могу изменить этот протокол (часть Cocoa), поэтому я не могу ничего добавить к интерфейсу обертки. – drasto