Ekstensi Objective-C

Sebuah ekstensi kelas memiliki beberapa kesamaan dengan sebuah kategori, tetapi itu hanya dapat ditambahkan ke kelas yang kode sumbernya Anda miliki pada waktu kompilasi (kelas tersebut dikompilasi pada waktu yang sama dengan ekstensi kelas).

Metode yang dideklarasikan oleh ekstensi kelas diimplementasikan dalam blok implementasi untuk kelas asli, jadi Anda tidak dapat, misalnya, mendeklarasikan ekstensi kelas pada kelas kerangka kerja, seperti kelas Cocoa atau Cocoa Touch seperti NSString.

Ekstensi sebenarnya adalah kategori tanpa nama kategori. Ini sering disebutanonymous categories.

Sintaks untuk mendeklarasikan ekstensi menggunakan kata kunci @interface, seperti deskripsi kelas Objective-C standar, tetapi tidak menunjukkan pewarisan apa pun dari subkelas. Sebagai gantinya, itu hanya menambahkan tanda kurung, seperti yang ditunjukkan di bawah ini -

@interface ClassName ()

@end

Karakteristik Ekstensi

  • Sebuah ekstensi tidak dapat dideklarasikan untuk kelas manapun, hanya untuk kelas yang kita memiliki implementasi asli dari kode sumbernya.

  • Ekstensi menambahkan metode privat dan variabel privat yang hanya khusus untuk kelas.

  • Metode atau variabel apa pun yang dideklarasikan di dalam ekstensi tidak dapat diakses bahkan oleh kelas yang diwariskan.

Contoh Ekstensi

Mari buat kelas SampleClass yang memiliki ekstensi. Di ekstensi, mari kita memiliki variabel pribadi internalID.

Kemudian, mari kita memiliki metode getExternalID yang mengembalikan externalID setelah memproses internalID.

Contoh ditunjukkan di bawah ini dan ini tidak akan berfungsi pada kompiler online.

#import <Foundation/Foundation.h>

@interface SampleClass : NSObject {
   NSString *name;
}

- (void)setInternalID;
- (NSString *)getExternalID;

@end

@interface SampleClass() {
   NSString *internalID;
}

@end

@implementation SampleClass

- (void)setInternalID {
   internalID = [NSString stringWithFormat: 
   @"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}

- (NSString *)getExternalID {
   return [internalID stringByReplacingOccurrencesOfString: 
   @"UNIQUEINTERNALKEY" withString:@""];
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass setInternalID];
   NSLog(@"ExternalID: %@",[sampleClass getExternalID]);        
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51

Pada contoh di atas, kita dapat melihat bahwa internalID tidak dikembalikan secara langsung. Di sini kami menghapus UNIQUEINTERNALKEY dan hanya menyediakan nilai yang tersisa untuk metode getExternalID.

Contoh di atas hanya menggunakan operasi string, tetapi dapat memiliki banyak fitur seperti enkripsi / dekripsi dan sebagainya.