Rozszerzenie klasy wykazuje pewne podobieństwo do kategorii, ale można dodawać tylko do klasy, dla których masz kod źródłowy w czasie kompilacji (klasa jest kompilowana w tym samym czasie, co rozszerzenie klasy). Metody zadeklarowane przez rozszerzenie klasy są zaimplementowane w @implementation bloku dla oryginalnej klasy, więc nie można na przykład zadeklarować rozszerzenia klasy w klasie framework, takiej jak klasa Cocoa lub Cocoa Touch, jak NSString.
składnia zadeklarować rozszerzenia klasa jest podobna do składni dla danej kategorii, a wygląda to tak:
@interface ClassName()
@end
Ponieważ żadna nazwa podana jest w nawiasie, rozszerzenia klasy są często określane jako anonimowe kategoriach .
W przeciwieństwie do zwykłych kategorii rozszerzenie klasy może dodawać do klasy własne właściwości i zmienne instancji. Jeśli zadeklarujesz nieruchomości w rozszerzeniu klasy tak:
@interface XYZAnimal() {
id _someCustomInstanceVariable;
}
...
@end
IMHO, najlepiej myśleć o rozszerzeniach klasy jako prywatny interfejs do klasy. Główny interfejs (w twoim pliku .h) działa jako interfejs publiczny, który definiuje klasową umowę behawioralną z innymi klasami.
rozszerzenia użyć klasy ukryć Prywatna Informacja
rozszerzenia klasy są często wykorzystywane do rozszerzenia interfejsu publicznego z dodatkowych metod prywatnych lub właściwości do zastosowania w realizacji samej klasie. Powszechne jest na przykład definiowanie właściwości jako tylko do odczytu w interfejsie, ale jako readwrite w rozszerzeniu klasy zadeklarowanym powyżej implementacji, aby wewnętrzne metody klasy mogły bezpośrednio zmienić wartość właściwości.
Jako przykład, klasa XYZPerson może dodać właściwość o nazwie uniqueIdentifier, zaprojektowaną do śledzenia informacji takich jak numer ubezpieczenia społecznego w USA.
Zazwyczaj wymaga dużej ilości dokumentów, aby mieć unikalny identyfikator przypisany do konkretnej osoby w rzeczywistym świecie, więc interfejs klasy XYZPerson może zadeklarować tę właściwość jako readonly i podać metodę, która żąda przypisania identyfikatora, np. to:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
aby klasa XYZPerson móc zmienić właściwość wewnętrznie, ma sens redeclare właściwość w rozszerzeniu klasy, który jest zdefiniowany w górnej części pliku wdrażania dla klasy:
@property (readwrite) NSString *uniqueIdentifier;
Uwaga: Atrybut readwrite jest opcjonalny, ponieważ jest domyślny. Możesz go użyć podczas redeclaracji nieruchomości, dla jasności.
kategorie to rzeczywisty kod. to sposób dodawania funkcji do klasy. rozszerzenia są (w kategoriach bardzo ogólnych) bardziej po prostu syntaktycznym cukrem, aby zasygnalizować pewne idee dotyczące prywatności itp. innym programistom. rozszerzenia nie zawierają kodu i nie są kodami. – Fattie
W przypadku rozszerzeń używanych w Swift zobacz to pytanie: http://stackoverflow.com/questions/24142829/how-to-create-swift-class-for-category – Suragch