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 @implementation 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.
Cú pháp để khai báo một phần mở rộng lớp tương tự như cú pháp cho một danh mục và trông giống như sau:
@interface ClassName ()
@end
Bởi vì không có tên nào được đặt trong dấu ngoặc đơn, phần mở rộng lớp thường được gọi là danh mục ẩn danh.
Không giống như các danh mục thông thường, một phần mở rộng lớp có thể thêm các thuộc tính và biến cá thể của riêng nó vào một lớp. Nếu bạn khai báo một thuộc tính trong phần mở rộng lớp, như sau:
@interface XYZAnimal () {
id _someCustomInstanceVariable;
}
...
@end
IMHO, tốt nhất bạn nên nghĩ về các phần mở rộng của lớp là giao diện riêng cho một lớp. Giao diện chính (trong tệp .h của bạn) hoạt động như giao diện công khai xác định hợp đồng hành vi của lớp với các lớp khác.
Sử dụng tiện ích mở rộng lớp để ẩn thông tin cá nhân
Phần mở rộng lớp thường được sử dụng để mở rộng giao diện công cộng với các phương thức hoặc thuộc tính riêng tư bổ sung để sử dụng trong quá trình triển khai của chính lớp đó. Ví dụ, thông thường, định nghĩa một thuộc tính là chỉ đọc trong giao diện, nhưng là ghi đọc trong phần mở rộng lớp được khai báo ở trên việc triển khai, để các phương thức bên trong của lớp có thể thay đổi trực tiếp giá trị thuộc tính.
Ví dụ: lớp XYZPerson có thể thêm một thuộc tính gọi là uniqueIdentifier, được thiết kế để theo dõi thông tin như Số an sinh xã hội ở Hoa Kỳ.
Nó thường yêu cầu một lượng lớn thủ tục giấy tờ để có một số nhận dạng duy nhất được chỉ định cho một cá nhân trong thế giới thực, vì vậy giao diện lớp XYZPerson có thể khai báo thuộc tính này là chỉ đọc và cung cấp một số phương thức yêu cầu một số nhận dạng được chỉ định, như sau:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
Để lớp XYZPerson có thể thay đổi thuộc tính bên trong, nên khai báo lại thuộc tính trong phần mở rộng lớp được định nghĩa ở đầu tệp triển khai cho lớp:
@property (readwrite) NSString *uniqueIdentifier;
Lưu ý: Thuộc tính readwrite là tùy chọn vì nó là thuộc tính mặc định. Bạn có thể muốn sử dụng nó khi khai báo lại một thuộc tính, để rõ ràng.