2011-07-06 17 views
5

Chciałem sprawdzić, czy ta poprawka rzeczywiście działa i nie będzie miało negatywnego wpływu na mój kodu:Przyjęcie protokołu z kategorii

Utworzyłem statyczną bibliotekę z MyClass.h nagłówku publicznym, reszta mojego kodu jest wszystko ukryte. MyClass przyjmuje protokół MyProtocol, który jest zdefiniowany w MyProtocol.h. Chcę ukryć MyProtocol.h, ale ponieważ MyClass.h jest publicznym nagłówkiem, nie może znaleźć MyProtocol.h, jeśli staram się ukryć go jako nagłówek projektu. Moje rozwiązanie:

MyClass.h:

@interface MyClass : NSObject { 
    //instance variables 
} 
// methods 
@end 

MyClass.m:

#import "MyProtocol.h" 
@interface MyClass() <MyProtocol> 
@end 

@implementation MyClass 
// implementation 
@end 

Nie widziałem inne przykłady tego typu rzeczy się robi inne niż tutaj: Can a category simultaneously implement a protocol?, a problem/odpowiedzi zakończyły się niezwiązaniem z pierwotnym pytaniem. Tak więc chciałem mieć pewność, że to faktycznie robi to, na co wygląda, i/lub sprawdzić, czy istnieje lepszy sposób osiągnięcia tego, co próbuję zrobić.

+3

Używanie kategorii w celu dostosowania klasy do protokołu jest legalne. –

Odpowiedz

6

To, co proponujesz, jest całkowicie legalne i stanowi dobre rozwiązanie Twojego problemu.

Istnieje jedno subtelne wyróżnienie semantyczne, które mogło utrudnić wyszukiwanie google w tym temacie. Używając pustego nawiasu w twoim przykładzie, technicznie zadeklarowałeś "rozszerzenie klasy", a nie "kategorię". Subtelna różnica polega na tym, że kompilator wymaga implementacji metod zadeklarowanych w rozszerzeniu klasy w głównym bloku @implementation klasy. Natomiast metody zadeklarowane w ramach nazwanej kategorii są implementowane w ramach osobnego bloku implementacji, często w osobnym pliku .m.

Powiązane problemy