субота, 3 березня 2012 р.

Objective-C (middle level)@"Protocol friend or foe(свій чужий)"

Нещодавно прийшлось зробити таку річ, як перевірка класу на наявність в ньому реалізації конкретно заданого протоколу, забігаючи на перед маю казати, що це було справжнеє випробування. Можу сказати, що давненько я так не гуглив, як той раз поки не знайшов щось схоже на  http://jomnius.blogspot.com/2011/01/how-to-check-if-ios-supports-class.html
Для уточнення:
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;


Немає коментарів:

Дописати коментар