Bir sınıf uzantısı, bir kategoriye bir miktar benzerlik taşır, ancak yalnızca derleme zamanında kaynak koduna sahip olduğunuz bir sınıfa eklenebilir (sınıf, sınıf uzantısı ile aynı zamanda derlenir). Bir sınıf uzantısı tarafından bildirilen yöntemler, orijinal sınıf için @ uygulama bloğunda uygulanır; bu nedenle, örneğin, bir Cocoa veya Cocoa Touch sınıfı gibi NSString gibi bir çerçeve sınıfında bir sınıf uzantısı bildiremezsiniz.
Bir sınıf uzantısı bildirmek için sözdizimi bir kategorinin sözdizimine benzer ve şuna benzer:
@interface ClassName ()
@end
Parantez içinde isim verilmediğinden, sınıf uzantılarına genellikle anonim kategoriler denir.
Normal kategorilerin aksine, bir sınıf uzantısı kendi özelliklerini ve örnek değişkenlerini bir sınıfa ekleyebilir. Bir sınıf uzantısında aşağıdaki gibi bir özellik bildirirseniz:
@interface XYZAnimal () {
id _someCustomInstanceVariable;
}
...
@end
IMHO, sınıf uzantılarını bir sınıfa özel arabirim olarak düşünmek en iyisidir. Birincil arabirim (.h dosyanızda), sınıfın diğer sınıflarla davranışsal sözleşmesini tanımlayan genel arabirim görevi görür.
Özel Bilgileri Gizlemek için sınıf uzantılarını kullanın
Sınıf uzantıları genellikle sınıfın kendisinin uygulanmasında kullanılmak üzere ek özel yöntemler veya özelliklerle ortak arabirimi genişletmek için kullanılır. Örneğin, bir özelliği arabirimde salt okunur olarak, ancak sınıfın dahili yöntemlerinin özellik değerini doğrudan değiştirebilmesi için uygulamanın üzerinde bildirilen bir sınıf uzantısında okuma yazma olarak tanımlamak yaygındır.
Örnek olarak, XYZPerson sınıfı, ABD'deki bir Sosyal Güvenlik Numarası gibi bilgileri izlemek için tasarlanmış, uniqueIdentifier adlı bir özellik ekleyebilir.
Gerçek dünyadaki bir kişiye atanmış benzersiz bir tanımlayıcıya sahip olmak genellikle büyük miktarda evrak gerektirir, bu nedenle XYZPerson sınıfı arabirimi bu özelliği salt okunur olarak ilan edebilir ve aşağıdaki gibi bir tanımlayıcı atanmasını isteyen bir yöntem sağlayabilir:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
XYZPerson sınıfının özelliği dahili olarak değiştirebilmesi için, özelliği, sınıfın uygulama dosyasının en üstünde tanımlanan bir sınıf uzantısında yeniden bildirmek mantıklıdır:
@property (readwrite) NSString *uniqueIdentifier;
Not: Readwrite niteliği isteğe bağlıdır çünkü varsayılan değerdir. Netlik açısından, bir mülkü yeniden beyan ederken bunu kullanmak isteyebilirsiniz.