условные реализации методов - PullRequest
0 голосов
/ 19 декабря 2009

хорошо .. подумайте об объекте .. объектА имеет необязательные свойства, определенные в его протоколе. делегат может или не может реализовать их, но если вы решите реализовать их, вы должны предоставить действительный возврат.

Теперь, что если у меня для objectA.delegate установлено значение objectB, но объект be должен реализовать их все во время компиляции, а во время выполнения решить, какие из них он может поддерживать или не поддерживать. Проблема в реализации их всех в качестве заглушек означает, что objectA просто будет использовать 'responsedsToSelector', чтобы увидеть, пытается ли делегат использовать необязательные свойства, и если это так, он предположит, что они действительны, и использует их.

Поскольку objectB (делегат) должен условно решать, какие из них реализовать, единственное решение, которое я вижу, - это использование class_addMethod.

Я надеялся, что может быть более элегантное и, возможно, более оптимальное решение, но не уверен, каким оно может быть.

Ответы [ 2 ]

1 голос
/ 19 декабря 2009

Каждый раз, когда вам кажется, что вам нужно использовать class_addMethod() для реализации чего-либо, вы почти всегда делаете это неправильно.

Из того, что вы описываете - что довольно расплывчато - простое решение состоит в том, чтобы создать что-то, что может одновременно выступать в роли делегата и может условно передавать методы по мере необходимости.

Теперь вы говорите, что если делегат реализует метод, он должен вернуть правильное значение. Если это так, class_addMethod() на самом деле не поможет. Большинство классов, которые реализуют делегаты, один раз проверит, реализует ли делегат метод, и затем предположит, что он действует всегда, если только делегат не изменится. Вы можете часто переключаться между делегатами, но на этом пути лежит безумие.

Лучшим ответом может быть задание вопроса; что вы пытаетесь сделать?

0 голосов
/ 19 декабря 2009

Да, используйте NSObject + (BOOL) resolInstanceMethod: (SEL) aSEL в сочетании с class_AddMethod и подключите реализацию, которую вы хотите, основываясь на любых критериях, которые вы хотите. Не уверен, что это то, что вы ищете или нет. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...