Для уточнення:
if ([class conformsToProtocol:@protocol(SomeProtocol)])
перевіряємо чи клас реалізує певний протокол
if ([item respondsToSelector:@selector(newMethod:)])
перевіряємо чи клас реалізує необхідний для нас метод. Я бачив випадки коли використовують дані перевірки в парі.
Проте це ще не все індоді можна необхідно зробити приблизно таке:
Наприклад в нас є масив в якому лежать UIView, UIButton, UILabel, тобто всі хто пов'язаний з UIView, до того ж ми знаємо, що в нас є декілька об'єктів, які реалізують наш протокол:
- MyButtonWithMyProtocol,
- MyViewWithMyProtocol,
- MyLabelWithMtProtocol,
- MyUIViewControllerWithMyProtocol.
UIView * view = [[UIView alloc] init];
(так само )
.............
.............
.............
NSArray * viewsArray =[ NSArray alloc] initWithObjects: view, button, label, myButton, myView, myLabel, myViewController, nil];
Тепер необхідно пройтись по всьому масиву, і витягти лише тих, хто реалізують мій протокол:
UIView<MyProtocol > * myView;
for (UIView * view in viewsArray)
{
if ([view conformsToProtocol:@protocol(MyProtocol))
{
myView = (UIView<MyProtocol> *)view;
//ще можна перевірити на можливість реалізації того чи іншого методу
if([myView respondsToSelector:@selector(myMethod:)])
{
NSLog(@"Ha-ha catch it!");
}
}
}
Найстрашнішим і по сьогоднішній день для мене залишається рядок (UIView<MyProtocol> *)view;
Немає коментарів:
Дописати коментар