Tiện ích mở rộng Objective-C

Phần mở rộng lớp mang một số điểm tương đồng với một danh mục, nhưng nó chỉ có thể được thêm vào một lớp mà bạn có mã nguồn tại thời điểm biên dịch (lớp được biên dịch cùng lúc với phần mở rộng lớp).

Các phương thức được khai báo bởi phần mở rộng lớp được triển khai trong khối thực thi cho lớp gốc, vì vậy, ví dụ: bạn không thể khai báo phần mở rộng lớp trên một lớp khung, chẳng hạn như lớp Cocoa hoặc Cocoa Touch như NSString.

Phần mở rộng thực sự là các danh mục không có tên danh mục. Nó thường được gọi làanonymous categories.

Cú pháp để khai báo tiện ích mở rộng sử dụng từ khóa @interface, giống như mô tả lớp Objective-C chuẩn, nhưng không chỉ ra bất kỳ sự kế thừa nào từ lớp con. Thay vào đó, nó chỉ thêm dấu ngoặc đơn, như hình dưới đây -

@interface ClassName ()

@end

Đặc điểm của Tiện ích mở rộng

  • Một phần mở rộng không thể được khai báo cho bất kỳ lớp nào, chỉ dành cho các lớp mà chúng ta có triển khai mã nguồn ban đầu.

  • Một phần mở rộng là thêm các phương thức private và các biến private chỉ cụ thể cho lớp.

  • Bất kỳ phương thức hoặc biến nào được khai báo bên trong phần mở rộng đều không thể truy cập được ngay cả đối với các lớp kế thừa.

Ví dụ về tiện ích mở rộng

Hãy tạo một lớp SampleClass có phần mở rộng. Trong tiện ích mở rộng, hãy có một biến private internalID.

Sau đó, hãy có một phương thức getExternalID trả về externalID sau khi xử lý InternalID.

Ví dụ được hiển thị bên dưới và điều này sẽ không hoạt động trên trình biên dịch trực tuyến.

#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;
}

Bây giờ khi chúng ta biên dịch và chạy chương trình, chúng ta sẽ nhận được kết quả như sau.

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

Trong ví dụ trên, chúng ta có thể thấy rằng InternalID không được trả về trực tiếp. Ở đây, chúng tôi xóa UNIQUEINTERNALKEY và chỉ cung cấp giá trị còn lại cho phương thức getExternalID.

Ví dụ trên chỉ sử dụng một hoạt động chuỗi, nhưng nó có thể có nhiều tính năng như mã hóa / giải mã, v.v.